【问题标题】:C++ Linker design questionC++ 链接器设计问题
【发布时间】:2011-06-20 06:42:22
【问题描述】:

所以这更像是一个设计问题,尽管有关 g++ 链接器的任何信息都会很棒。

我在以下结构中嵌入了 .cpp 文件:

Main
Main/Utilities
Main/Utilities/Data

当我在 Main 中编译主入口点 .cpp 时,我必须指定任何链接的 .cpp 曾经使用过的所有 .cpp 文件 - 这对于我只有 5 个链接文件的测试项目来说很好,但是这个项目会增长很快,这显然是不可行的。有没有办法解决这个问题?这是什么原因造成的?

我尝试使用“g++ *.cpp”,但它仍然希望我链接其他人。我必须做一些类似“g++ main.cpp Utilities/other.cpp Utilities/Data/data.cpp”的事情。 other.cpp 使用 data.cpp,main.cpp 使用 other.cpp。在编译 other.cpp 时,我必须像以前一样指定 data.cpp。

非常感谢您的任何想法或帮助!

【问题讨论】:

  • 我认为您对一些术语感到困惑。 g++ 是 C++ 编译器,而不是链接器。但是,为了您的利益,它将使用正确的参数在后台为您调用链接器(在大多数 UNIX 系统上为 ld)。

标签: c++ linux linker g++


【解决方案1】:

管理大型项目的一般方法是使用适当的目录结构(如您已有的目录结构),然后在每个目录中放置一个Makefile。顶级Makefile 应该递归调用所需的Makefiles。每个Makefile 都应指定要从该目录编译的源文件(以及其他编译标志,如果需要)。理想情况下,您应该根据您的要求制作静态库(或者可能是动态的)。一旦你编译了所有依赖代码(意味着你有 .lib.o 文件),那么你应该编译具有入口点的源文件(例如 c/c++ 中的 main 函数)并指定依赖链接器的库 (ld)。

举个例子,只要看看任何至少有 2 级目录结构的开源项目。

【讨论】:

    【解决方案2】:

    ...我必须指定任何链接的 .cpp 曾经使用过的所有 .cpp 文件...

    这是错误的。您必须为链接器提供足够的信息来解析代码中使用的所有符号,但您可以将其作为源代码文件(.cpp 等)、目标文件 (.o) 或库(.so 或 .一种)。将每个源代码文件编译为目标文件,然后将每个目标文件链接在一起以创建二进制文件就足够了。

    g++ foo.cpp -c -o foo.o
    g++ bar.cpp -c -o bar.o
    g++ main.cpp -c -o main.o
    g++ main.o foo.o bar.o -o main.exe
    

    【讨论】:

      【解决方案3】:

      我假设您实际上是在一个 UNIX(类似)系统上,因此 shell 会将 *.cpp 通配符规范替换为实际的文件名。其他系统的行为可能有所不同,尽管我对此表示怀疑。

      您已将文件存储在目录结构中,因此简单地说 *.cpp 只会匹配您调用 g++ 的当前目录中的文件 - 在您的情况下大概只是 main.cpp。

      如果您还想用通配符覆盖所有其他文件,您还必须在命令行中指定它们。在你的情况下:

      g++ *.cpp Utilities/*.cpp Utilities/data/*.cpp
      

      如果这实际上比简单地命名所有文件更容易,我无法判断。

      编辑:正如其他人所说,编译/构建非平凡程序的最佳方法当然是使用make 或一些类似的构建工具。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 2013-10-10
        • 2016-10-24
        • 1970-01-01
        • 2010-11-17
        相关资源
        最近更新 更多