在Linux上进行C++开发 - 我应该从哪里开始?

43

我决定放弃Windows并将Debian作为我的默认操作系统。我一直在Windows下编写代码,尤其是使用Visual Studio。我现在正在努力适应在Linux下编译我的代码。

虽然我还有很多文档要阅读,也不指望你们能够让它变得太容易,但如果能给我一些起点的建议就会很好。我有一些具体问题,但随时欢迎关于这个主题的任何其他建议/推荐。

  • 有哪些制作makefile的推荐指南?我该如何从这个makefile中进行编译(我需要自己调用g++吗,还是使用“make”命令?)
  • 浏览其他Linux软件时,它们几乎总是有一个“configure”文件。它到底是做什么的?它只检查所需的库是否安装,还是除了检查要求之外还做了其他事情?
  • 我该如何链接库,这与我的makefile或g++参数有什么关系?在Windows中,我会编译库、包含一些头文件、告诉链接器要链接哪个附加lib文件并复制一个dll文件。在Linux中,这个过程究竟是如何工作的?
  • 代码编辑器的推荐?我目前正在使用nano,听说过vim和emacs,但不知道它们相互之间的优势是什么。还有其他的编辑器吗?为什么我会考虑它们而不是前面提到的三个之一?注意:我不需要一个IDE。

非常感谢任何帮助、指向指南和文档(最好是面向初学者的)的链接!


PS:这应该是社区维基吗? - Daniel Sloof
不要解释。 - Tim Matthews
也许这会给你一些思路.. http://firstcprograminlinux.blogspot.com/ - anand
12个回答

23

有没有关于创建makefile的推荐指南?我该如何从makefile编译(我自己调用g++还是使用'make'?)

通过调用"make"命令从makefile编译。在您的makefile中,使用g ++和ld进行编译和链接。

查看其他Linux软件时,它们几乎总是具有“configure”文件。它到底是做什么的?它只检查所需的库是否已安装,还是除了检查要求之外还做了其他事情?

这是一个脚本,通常用于根据正在用于构建的环境设置各种内容。有时它只是一个基本的shell脚本,其他时候它会调用像Autoconf这样的工具来发现在构建时可用的内容。 "configure"脚本通常也是用户指定各种可选内容的地方,比如支持实验性功能。

如何链接库,这与我的makefile或g ++参数有什么关系?在Windows中,我会编译库,包含一些头文件,告诉我的链接器要链接哪个附加lib文件,并复制dll文件。这个过程在Linux中究竟是如何工作的?

ld是GNU链接器。您可以单独调用它(这是大多数makefile最终会执行的操作),或者您可以让g ++代理它。您传递给g ++和ld的选项确定在哪里查找已包含的标头,要链接的库以及如何输出结果。

代码编辑器推荐?我目前正在使用nano,听说过vim和emacs,但不知道它们相互之间的好处。有其他编辑器吗?为什么我要考虑它们而不是前面三个中的任何一个?注意:我不需要IDE。

Vim和Emacs都是非常灵活的编辑器,支持各种不同的用法。使用您感觉最好的那个,尽管建议您可能需要一些最小的东西,例如语法高亮。


15

补充一下MandyK的回答。手动创建make文件通常是在Linux发行版/Unix变体之间构建的非常不可移植的方式。有许多构建系统可以自动生成make文件,也可以在没有make文件的情况下进行构建。 如GNU AutotoolsCmakeSconsjam等。

关于configure,还要更深入地了解一下:

  • 检查可用的编译器、库和系统架构。
  • 确保您的系统与适当的兼容软件包列表匹配。
  • 允许您指定命令行参数来专门化您的构建、安装路径、选项软件包等。
  • 然后,configure会生成一个特定于您的系统的合适的Makefile。

Scons是Makefile的一个很好的替代品。 - Bjorn

7
以下是翻译的结果,仅供参考:

有哪些关于创建makefile的推荐指南?我该如何从这个makefile中进行编译(我自己调用g++还是使用'make'命令)?

我通过阅读GNU Make手册学会了如何编写makefile。

看其他Linux软件,它们似乎总是有一个“configure”文件。它到底是做什么的?它只是检查所需的库是否安装,还是除了检查要求之外还有其他作用呢?

configure文件通常与autotools相关联。正如脚本名称所示,它允许您配置软件。从开发人员的角度来看,这主要意味着设置宏,确定变量,可用的库等。它还测试库的可用性。最终,该脚本生成一个GNU Makefile,您可以使用它来实际构建和安装软件。

GNU构建系统只是其中之一。我并不特别喜欢GNU构建系统,因为它往往比其他构建系统慢,并且生成的Makefile很丑。一些更受欢迎的是CMake,Jam(对于C ++,Boost Jam可能会有兴趣)和waf。一些构建系统仅生成Makefiles,而其他一些则提供全新的构建系统。对于简单的项目,手动编写Makefile将很容易,但必须手动进行“依赖项检查”(例如库等)。

编辑:Brian Gianforcaro也指出了这一点。


4
您的问题有点过于笼统,但这是我建议的内容:
  • 编辑器:vim和emacs很受欢迎。像大多数工具一样,最重要的是掌握其中一个。我喜欢使用vim,因为vi(它的后代)无处不在,但如果您只在Linux上使用,则可能不太相关。任何编程编辑器都可以。

  • 配置:除非您做大型项目,否则不必费心。它难以使用和调试。仅当您打算分发您的项目时才有意义-在这种情况下,请阅读autobook:http://sources.redhat.com/autobook/。正如其他人所说,还有其他选择(cmake、scons等)。我对scons和autotools都很熟悉,但对于小型(几个文件)项目仍然使用make。

关于共享库:它与Windows几乎相同,只是您直接链接到共享库-在Linux中没有.lib vs .dll区别。例如,对于具有函数foo的库foo:

int foo(void)
{
     return 1;
}

您需要按以下步骤构建它:
gcc -fPIC -c foo.c -o foo.o
gcc -shared foo.o -o libfoo.so

一个主要的(当然在现实生活中,您需要将API放在头文件中):
int foo(void);

int main(void)
{
    foo();
    return 0;
}

然后,您可以将其链接为:
gcc -c main.c -o main.o
gcc main.o -o main -L. -lfoo 

-L. 表示你希望链接器查找当前目录(与 Windows 相反,在 Linux 中默认情况下永远不会执行此操作),-lfoo 表示链接到 foo 库。

4
什么代码编辑器值得推荐?我目前使用nano,听说还有vim和emacs,但不知道它们相对于彼此的优势。还有其他编辑器吗?为什么会考虑它们而不是前三者?注:我不需要一个IDE。

Vi和Emacs是两个典型的Unix编辑器;如果你决定使用文本编辑器而不是IDE,那么他们或他们的衍生产品(vim、xemacs等)都是不错的选择。它们都支持语法高亮和各种特性,无论是默认的还是通过扩展实现的。这些编辑器最好的部分在于它们提供了可扩展性;Emacs通过各种Lisp,而vim通过它自己的脚本语言。

我个人使用Emacs,所以对Vim的了解不多,但你应该能够在网上找到大量关于两者的信息。Emacs有几个很好的教程和参考资料,包括这个

编辑[2014年12月]:近来出现了一种跨平台且高度可扩展的编辑器趋势。如果您想要比IDE更简单但在多个平台上感觉更原生的图形化编辑器,则这可能是一个不错的选择。我建议看看SublimeAtom;这两者都可以在Windows / Linux / Mac上工作,并拥有众多插件和主题的社区。


4
为了帮助你入门,我首先会向这个makefile的指南进行引导,它还涵盖了一些链接的内容。
这是我的大学计算机科学教授给我们提供的资料,我发现它非常清晰简明,非常有帮助。
至于IDE,我通常使用Eclipse,因为它也处理makefile。更不用说编译和标准输出都在程序中随手可得。
它主要是为Java开发而设计的,但也有C/C ++插件!

3

我推荐阅读The Art of Unix Programming这本由ESR撰写的书籍。它涵盖了编辑器、编程语言等方面的选择,并且能够很好地阐述Unix或Linux编程背后的思维方式。

对于编辑器,你可能想选择Vim或Emacs。它们都有所不同,哪一个更好更多是基于个人口味而定。我使用Vim,它非常适合快速移动代码并进行更改。我不太喜欢Emacs,但很多人都很喜欢它。Emacs极其可扩展,可以用于从新闻阅读器到IDE的一切事情。试用两者并看看你喜欢哪个。


2
这本书似乎也可以在PDF格式下获取,网址为http://catb.org/~esr/writings/taoup/html/graphics/taoup.pdf。 - sharrajesh
"哪一个更好,更多地取决于个人口味" -> "这是一场宗教战争的问题" ;) - Tomm P

3
如果您正在使用Linux窗口管理器(KDE,Gnome等),您还可以考虑使用窗口管理器的标准文本编辑器。它相对于vim / emacs / nano的主要优点是,它会更加熟悉来自Windows环境的用户-为窗口管理器编写的编辑器具有菜单栏,文件打开/保存对话框,撤消/重做以及许多其他漂亮的功能,控制台编辑器可能无法匹配。 (尽管emacs和vim这些天已经非常复杂了,所以谁知道;-P)
在KDE上(这是我使用的)我可以推荐KWrite,它是一个功能齐全但相当基本的文本编辑器,具有语法高亮功能;或Kate,它是一个更高级的文本编辑器,具有一些额外的功能:会话管理,内置终端面板,自动调用make,以及包括C / C ++符号查看器在内的几个插件。当我不想麻烦设置完整的IDE项目时,我通常使用Kate进行C ++工作。 (FYI KDE的IDE是KDevelop)

2

直接调用g++和使用autotools构建链之间的差距很小。熟练掌握autotools,这确实是Linux / Open Source世界中最接近“项目”的东西。


2

对于从Visual Studio转过来的人来说,所有这些命令行东西可能看起来很神秘,也很乱。在你变成一个bash shell/vim/emacs狂热者之前,先试用一些基于GUI的工具,这样你就有了一些过渡时间...

  • QT 4.5及其QT Creator迷你IDE。这是最好的框架,比竞争对手领先数光年。
  • Eclipse(C++)-根据我在Windows上的经验,我发现它非常惊人(这可能是有史以来最好的Java应用程序)
  • KDevelop
  • Anjuta
  • 如果您使用Delphi,则Lazarus/FreePascal是一个很好的替代品。

我相信一些长发怪会嘲笑并声称vim或emacs给他们提供了最好和最快的开发环境,但不同的人有不同的做法。习惯于使用集成开发环境的人需要一些时间来适应或可能根本不想切换。 尽管他们拥有编辑技能,但创建GUI应用程序绝对不是80x25工具的任务。 成为命令行方面的专家需要多年时间,这更像是一种世界观的转变而不是其他任何事情。


使用GUI构建GUI非常棒。然后呢?然后你挖出vim和emacs!在IDE中,有人打开并填写查找/替换窗口之前,Vim可以重命名六个函数调用。 - Zan Lynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接