所以这是一个设计问题而不是任何东西,尽管有关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。
非常感谢您的任何想法或帮助!
答案 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
或类似的构建工具。