在Linux上的C + +开发 – 我在哪里开始?

我决定离开我的Windows后面安装,现在运行Debian作为我的默认操作系统。 我一直使用Windows编码,特别是使用Visual Studio。 我目前正试图习惯于在linux下编译我的代码。

虽然我还有很多文档要阅读,不要指望你们对我来说太简单了,但是从某个angular度来看,还是很好的。 我有一些具体的问题,但随时build议/推荐任何有关这个问题。

  • 什么是build立一个make文件的build议指南,如何从这个makefile编译(我自己调用g ++,我使用'make'?)
  • 看看其他的linux软件,他们几乎总是有一个“configuration”文件。 它究竟做了什么? 它是否只检查所需的库是否安装或不仅仅是检查需求?
  • 我如何链接库,这与我的makefile或g ++参数有什么关系? 在Windows中我会编译库,包括一些头文件,告诉我的链接器什么额外的lib文件链接,并复制一个dll文件。 这个过程到底如何在Linux中工作?
  • 代码编辑器的build议? 我目前使用nano,我听说过vim和emacs,但不知道他们的优点是什么,而不是彼此。 还有没有其他的,为什么我会考虑他们在前三个? 注意:我不是在寻找一个IDE。

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

什么是建立一个make文件的建议指南,如何从这个makefile编译(我自己调用g ++,我使用'make'?)

你通过调用“make”从makefile文件中建立起来。 而在你的makefile中,你使用g ++和ld来编译和链接。

看看其他的linux软件,他们几乎总是有一个“配置”文件。 它究竟做了什么? 它是否只检查所需的库是否安装或不仅仅是检查需求?

这是一个通常用于根据建筑物使用环境设置各种东西的脚本。 有时它只是一个基本的shell脚本,有时候它会调用像Autoconf这样的工具来发现构建时可用的东西。 “配置”脚本通常也是用户指定要构建或排除的各种可选事物的地方,如支持实验性功能。

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

ld是GNU链接器。 你可以单独调用它(这是大多数makefile最终会做的),或者你可以让g ++委托给它。 您传递给g ++和ld的选项决定在哪里查找包含的头文件,链接的库以及如何输出结果。

代码编辑器的建议? 我目前使用nano,我听说过vim和emacs,但不知道他们的优点是什么,而不是彼此。 还有没有其他的,为什么我会考虑他们在前三个? 注意:我不是在寻找一个IDE。

Vim和Emacs是非常灵活的编辑器,支持一大堆不同的用法。 使用任何最适合你的方式,虽然我建议你可能需要一些简单的东西,比如语法高亮。

只需要注意MandyK的答案。

手动创建make文件通常是在Linux发行版/ unix变体之间构建的非常不可移植的方式。 有很多自动生成make文件的构建系统,没有make文件的构建。 GNU Autotools , Cmake , Scons , 果酱等

还要深入了解一下配置。

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

什么是建立一个make文件的建议指南,如何从这个makefile编译(我自己调用g ++,我使用'make'?)

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

看看其他的linux软件,他们几乎总是有一个“配置”文件。 它究竟做了什么? 它是否只检查所需的库是否安装或不仅仅是检查需求?

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

GNU构建系统只是其中的一个。 我不特别喜欢GNU构建系统,因为它往往比别人慢,并生成一个丑陋的Makefile。 一些比较流行的是CMake ,Jam( Boost Jam可能对C ++感兴趣)和waf 。 一些构建系统只是生成Makefiles,而另一些则提供了一个全新的构建系统。 对于手动编写Makefile的简单项目来说很简单,但是“依赖检查”(对于库等)也必须手动完成。

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

你的问题有点过于笼统,但是这是我的建议:

  • 编辑:vim和emacs很受欢迎。 与大多数工具一样,最重要的是掌握一个工具。 我喜欢使用vim,因为vi(它的后代)在任何地方都可用,但是这可能不是很相关,特别是如果你留在Linux上。 任何编程编辑器都可以。

  • 配置:除非你做大项目,不要打扰它。 使用和调试是一个噩梦。 如果你打算分发你的项目,那么只有这个意义 – 在这种情况下,阅读一下自动阅读: http : //sources.redhat.com/autobook/ 。 正如其他人所说,有替代品(cmake,scons等…)。 我对scons和autotools都非常熟悉,但是我仍然使用make来制作一些小的(几个文件)项目。

关于共享库:除了直接链接到共享库之外,它几乎和Windows一样 – 在Linux中没有.lib和.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。

所以为了让你开始,我将首先将你指向makefiles的这个指南 ,它也涵盖了一些链接的东西。
这只是我的大学计算机科学教授给我们的一点东西,我发现它非常清晰和简洁,非常有帮助。

至于IDE,我通常使用eclipse,因为它也处理makefile。 更不要说编程和标准输出在程序中触手可及。
它主要用于Java开发,但也有一个C / C ++插件!

我推荐“ESR 编程的艺术 ”一书。 它涵盖了编辑器,编程语言等的选择。它也给了Unix或Linux编程背后的思路。

对于编辑者,你可能需要Vim或者Emacs。 他们是不同的,哪一个比谁更擅长个人品味。 我用Vim。 快速移动代码并进行更改是非常好的。 我不喜欢Emacs,但很多人都这么做。 Emacs是非常可扩展的,可用于从新闻阅读器到ide的所有内容。 试试看看你喜欢什么。

  • 代码编辑器的建议? 我目前使用nano,我听说过vim和emacs,但不知道他们的优点是什么,而不是彼此。 还有没有其他的,为什么我会考虑他们在前三个? 注意:我不是在寻找一个IDE。

如果你正在使用Linux和窗口管理器(KDE,Gnome等),你也可以考虑为你的窗口管理器使用标准的文本编辑器。 它对vim / emacs / nano的主要好处在于它对于来自Windows环境的人来说似乎更为熟悉 – 编写用于在窗口管理器上运行的编辑器有一个菜单栏,文件打开/保存对话框,撤销/重做,还有很多控制台编辑器可能无法比拟的其他精巧功能。 (虽然现在emacs和vim相当复杂,所以谁知道; -P)

在KDE(这是我使用的),我可以推荐KWrite,这是一个功能强大,但相当基本的文本编辑器与语法突出显示; 或者Kate,这是一个更加出色的文本编辑器,它具有一些额外的功能:会话管理,内置的终端面板, make自动调用以及包括C / C ++符号查看器在内的多个插件。 当我不想费心设置一个完整的IDE项目时,我通常使用Kate来处理我的C ++工作。 (仅供参考KDE的IDE是KDevelop)

代码编辑器的建议? 我目前使用nano,我听说过vim和emacs,但不知道他们的优点是什么,而不是彼此。 还有没有其他的,为什么我会考虑他们在前三个? 注意:我不是在寻找一个IDE。

Vi和Emacs是两个典型的Unix编辑器; 如果你使用的是文本编辑器而不是IDE,那么其中的一个或者它们的衍生物(vim,xemacs等等)就是要走的路。 两者都支持语法高亮和各种功能,默认情况下或通过扩展。 这些编辑最好的部分是它们提供的可扩展性。 emacs通过各种lisp和vim通过自己的脚本语言。

我个人使用Emacs,所以我不能多说Vim,但是你应该能够找到很多关于在线的信息。 Emacs有几个很好的教程和参考资料,包括这个 。

编辑[十二月2014]:最近似乎有一个跨平台和高度可扩展的编辑趋势。 如果你喜欢比IDE更少的东西,这可能是一个不错的选择,但是在多个平台上比vi / emacs和本地感觉更像图形。 我建议看Sublime或Atom ; 它们都可以在Windows / Linux / Mac上运行,并且拥有大量的插件和主题。

对于来自Visual Studio的人来说,所有这些命令行的东西可能看起来神秘而混乱。 在你变成一个bash shell / vim / emacs junkie之前,先尝试一些基于GUI的工具,这样你就有一些转换时间了。

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

我敢肯定长头发会嘲笑并声称vim或者emacs给了他们最好最快的开发环境,但是对于不同的人来说却是不同的笔触。 习惯IDE的人需要一些时间来切换,或者根本不想切换。 对于他们所有的编辑能力,创建GUI应用程序当然不是80×25工具的工作。 要成为事物的命令线方面的专家需要多年的时间,更多的是世界观的转变。

直接调用g ++和使用autotools构建链之间的空间是非常狭窄的。 熟练使用autotools,这与Linux / Open Source世界中的“项目”非常接近。

作为在这里正确的答案的一个侧面说明..如果你想作为一个Windows的家伙跑到地面,我会建议新的新的Qt SDK 。 它会觉得像家一样:-)

我建议使用SCons代替Make,它可以完成同样的工作,但是如何使用动态库,依赖关系等,可以更容易地使用和处理。这里是一个简单编程的真实例子

 env = Environment() env.Append(CCFLAGS='-Wall') env.Append(CPPPATH = ['./include/']) env.MergeFlags('-ljpeg') env.ParseConfig("sdl-config --cflags --libs") env.ParseConfig("curl-config --cflags --libs") env.ParseConfig("pkg-config cairo --cflags --libs") env.Program('rovio-pilot', Glob('./src/*.cpp')) 

作为一个文本编辑器,我对JEdit的代码感到满意,但这是一个有趣的问题。