【问题标题】:C++ development on linux - where do I start?Linux 上的 C++ 开发 - 我从哪里开始?
【发布时间】:2010-10-12 00:05:12
【问题描述】:

我决定放弃我的 Windows 安装,现在将 Debian 作为我的默认操作系统运行。我一直在 Windows 中进行编码,特别是使用 Visual Studio。我目前正在尝试习惯在 linux 下编译我的代码。

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

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

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

【问题讨论】:

  • ps:这应该是社区维基吗?!
  • NO 因为不是 wiki 而离开,但所有这些问题都曾被问过。
  • 也许这会给你一些想法。firstcprograminlinux.blogspot.com

标签: c++ linux editor makefile linker


【解决方案1】:

关于创建 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 是非常灵活的编辑器,它们支持一大堆不同的用法。使用你觉得最好的任何东西,但我建议你可能需要一些最小的东西,比如语法突出显示。

【讨论】:

    【解决方案2】:

    仅附上 MandyK 答案的注释。

    手动创建 make 文件通常是一种跨 Linux 发行版/unix 变体构建的非常不便携的方式。有许多用于自动生成 make 文件的构建系统,在没有 make 文件的情况下构建。 GNU AutotoolsCmakeSconsjam

    还要更深入地了解配置。

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

    【讨论】:

    • Scons 是 Makefile 的绝佳替代品
    【解决方案3】:

    推荐的指南有哪些 创建一个make文件,我如何编译 从这个makefile(我叫g ++ 我自己,我用'make'吗?)

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

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

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

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

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

    【讨论】:

      【解决方案4】:

      你的问题有点太笼统了,但我会建议:

      • 编辑器: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
      

      一个main(当然在现实生活中你把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】:

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

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

        【讨论】:

          【解决方案6】:

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

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

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

          编辑 [2014 年 12 月]:最近似乎出现了跨平台和高度可扩展的编辑器的趋势。如果您想要的不是 IDE,而是比 vi/emacs 更图形化并且跨多个平台的原生感觉,这可能是一个不错的选择。我建议查看SublimeAtom;这两者都可以在 Windows/Linux/Mac 上运行,并且拥有很棒的插件和主题社区。​​p>

          【讨论】:

            【解决方案7】:

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

            对于编辑器,您可能需要 Vim 或 Emacs。它们都是不同的,哪一个更好更取决于个人品味。我使用 Vim。它非常适合快速移动代码并进行更改。我不太喜欢 Emacs,但很多人喜欢。 Emacs 具有极强的可扩展性,可用于从新闻阅读器到 ide 的所有内容。两者都试一下,看看你喜欢什么。

            【讨论】:

            【解决方案8】:
            • 对代码编辑器的建议?我目前正在使用 nano,我听说过 vim 和 emacs,但不知道它们对彼此有什么好处。还有其他的吗,为什么我会在前三个中考虑它们?注意:我不是在寻找 IDE。

            如果您使用带有窗口管理器(KDE、Gnome 等)的 Linux,您还可以考虑为您的窗口管理器使用标准文本编辑器。与 vim/emacs/nano 相比,它的主要好处是,对于来自 Windows 环境的人来说,它似乎更熟悉 - 编写为在窗口管理器上运行的编辑器具有菜单栏、文件打开/保存对话框、撤消/重做,以及许多其他控制台编辑器可能无法匹配的简洁功能。 (虽然如今 emacs 和 vim 相当复杂,但谁知道呢 ;-P)

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                对于来自 Visual Studio 的人来说,所有这些命令行内容可能看起来晦涩难懂。 在你变成 bash shell/vim/emacs 迷之前,先尝试一些基于 GUI 的工具,这样你就有了一些过渡时间......

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

                我敢肯定,longhairs 会嗤之以鼻,并声称 vim 或 emacs 为他们提供了最好和最快的开发环境,但对于不同的人来说不同的招数。习惯于 IDE 的人将需要一些时间来切换,或者可能根本不想切换。 对于他们所有的编辑能力,创建 GUI 应用程序肯定不是 80x25 工具的工作。 成为命令行方面的专家需要数年时间,这更像是世界观的转变,而不是其他任何事情。

                【讨论】:

                • 使用 GUI 构建 GUI 非常棒。然后呢?然后你挖出vim和emacs! Vim 可以重命名六个函数调用,然后才能在 IDE 中打开并填写 Find/Replace 窗口。
                【解决方案11】:

                作为正确答案的旁注。如果您想以 Windows 用户的身份开始运行,我建议您使用全新的Qt SDK。会有家的感觉:-)

                【讨论】:

                  【解决方案12】:

                  我建议使用 SCons 代替 Make,它可以完成相同的工作,但它更易于使用和处理如何制作动态库、依赖项等。这是一个简单 prog 的真实示例

                  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 进行编码,但这只是个人喜好问题。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-02-23
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多