C ++ Linker设计问题

时间:2011-06-20 06:42:22

标签: c++ linux linker g++

所以这是一个设计问题而不是任何东西,尽管有关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。

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

3 个答案:

答案 0 :(得分:3)

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

例如,只需查看具有至少2级目录结构的任何开源项目。

答案 1 :(得分:0)

  

...我必须指定任何链接的.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

答案 2 :(得分:0)

我假设您实际上是在UNIX(如)系统上,因此shell会将*.cpp通配符规范替换为实际的文件名。其他系统可能表现不同,但我对此表示怀疑。

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

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

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

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

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