Linux上的C ++开发 - 我从哪里开始?

时间:2009-03-08 04:38:02

标签: c++ linux editor makefile linker

我决定将我的Windows安装置于后面,现在正在运行Debian作为我的默认操作系统。我总是用Windows编写,特别是用Visual Studio编写。我目前正在尝试习惯在linux下编译我的代码。

虽然我仍然需要阅读很多文档,并且不要指望你们让它对我来说太容易了,但是如果能得到一些关于从哪里开始的指示仍然很好。我有一些具体的问题,但随时可以建议/推荐有关该主题的任何其他内容。

  • 有关创建make文件的建议指南,如何从这个makefile编译(我自己调用g ++,是否使用'make'?)
  • 看看其他linux软件,它们几乎总是有一个'configure'文件。它到底是做什么用的?它是否仅检查是否安装了所需的库,还是仅仅检查要求?
  • 如何链接库,以及它与makefile或g ++参数的关系如何?在Windows中我会编译库,包含一些头文件,告诉我的链接器要链接哪些附加的lib文件,并复制一个dll文件。这个过程究竟是如何在linux中运行的?
  • 代码编辑推荐?我目前正在使用nano,我听说过vim和emacs,但不知道它们对彼此有什么好处。还有其他人,为什么我会考虑过前三个中的任何一个?注意:我不是在寻找IDE。

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

12 个答案:

答案 0 :(得分:22)

  

有关创建make文件的建议指南,如何从这个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是非常灵活的编辑器,支持大量不同的用法。尽可能使用对你最好的方法,但我建议你可能需要一些最小的东西,比如语法高亮。

答案 1 :(得分:13)

请注意MandyK的答案。

手工创建make文件通常是构建跨linux发行版/ unix变种的一种非常不可移植的方式。有许多构建系统可用于自动生成make文件,无需make文件即可构建。 GNU AutotoolsCmakeSconsjam

还要更深入地了解配置。

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

答案 2 :(得分:7)

  

建议的指南是什么   创建一个make文件,我该怎么编译   从这个makefile(我称之为g ++)   我自己,使用'make'?)

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

  

看看其他linux软件,他们   几乎总是似乎有一个   '配置'文件。究竟是什么呢   做?它只检查是否需要   库已安装或执行   不只是检查要求?

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

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

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:4)

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

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

  • configure:除非你做大项目,否则不要理会它。这是一个使用和调试的噩梦。只有在您打算分发项目时才有意义 - 在这种情况下,请阅读自动提醒: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。

答案 5 :(得分:3)

  

代码编辑的建议?我是   目前使用nano和我听说过   vim和emacs,但不知道是什么   他们的好处是相互影响。   还有其他人,我为什么要这样做   考虑过他们之前的任何一个   三?注意:我不是在寻找   IDE。

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

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

EDIT [2014年12月]:最近似乎存在跨平台和高度可扩展的编辑器的趋势。如果你想要的东西比IDE更少,但是比vi / emacs更具图形性,并且在多个平台上有本机感,这可能是一个不错的选择。我建议您查看SublimeAtom;这些都可以在Windows / Linux / Mac上运行,并且具有很好的插件和主题社区。

答案 6 :(得分:3)

我推荐ESR的书The Art of Unix Programming。它涵盖了编辑器,编程语言等的选择。它还对Unix或Linux编程背后的思维方式有了很好的理解。

对于编辑,您可能需要Vim或Emacs。它们都是不同的,哪一个更好,更多的是个人品味而不是其他任何东西。我用Vim。它非常适合快速移动代码并进行更改。我不喜欢Emacs,但很多人都喜欢。 Emacs非常易于扩展,可用于从新闻阅读器到ide的所有内容。试试两个,看看你喜欢什么。

答案 7 :(得分:3)

  
      
  • 代码编辑推荐?我目前正在使用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)

答案 8 :(得分:2)

直接调用g ++和使用autotools构建链之间的空间非常狭窄。熟悉autotools,这是Linux /开源世界中最接近“项目”的东西。

答案 9 :(得分:2)

对于来自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应用程序肯定不是80x25工具的工作。 成为命令行方面的专家需要花费数年的时间,这更像是对世界观的转变。

答案 10 :(得分:1)

作为这里正确答案的旁注。如果你想成为一个Windows家伙,我会建议新的Qt SDK。它会像家一样: - )

答案 11 :(得分:0)

我建议使用SCons代替Make,它可以完成相同的工作,但它更容易使用和开箱即用,如何制作动态库,依赖项等。这是一个简单的编程的真实例子< / p>

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的编码很满意,但这是一个品味问题。