我可以访问一个大型的C ++项目,这个项目充满了文件,并且有一个非常复杂的makefile,这是由automake& amp;朋友
以下是目录结构的概念。
otherproject/
folder1/
some_headers.h
some_files.cpp
...
folderN/
more_headers.h
more_files.cpp
build/
lots_of things here
objs/
lots_of_stuff.o
an_executable_I_dont_need.exe
my_stuff/
my_program.cpp
我想使用大项目中的一个,在“some_header.h”中声明
/* my_program.cpp */
#include "some_header.h"
int main()
{
ThatClass x;
x.frobnicate();
}
我设法通过艰苦地将大量“-I”选项传递给gcc来编译我的文件,以便它可以找到所有头文件
g++ my_program.cpp -c -o myprog.o -I../other/folder1 ... -I../other/folderN
在编译时,我必须手动包含他所有的“.o”,这可能是矫枉过正
g++ -o my_executable myprog.o ../other/build/objs/*.o
然而,我不仅要做一些事情,比如从列表中手动删除他的“main.o”,但这还不够,因为我忘了也链接到他碰巧使用的所有库。< / p>
otherproject/build/objs/StreamBuffer.h:50: undefined reference to `gzread'
此时我开始觉得自己可能做错了什么。 我该怎么办?什么是通常的,这种问题的最佳方法是什么?
我需要这个在Linux上运行,以防需要特定于平台。
答案 0 :(得分:3)
通常项目的.o
文件应该组合成一个库(在Linux上,.a
文件(如果它是静态库),或.so
如果它是动态库,并且你使用-L
选项链接到库以指定位置,使用-l
选项指定库名称。
例如,如果库文件位于/path/to/big_project/libbig_project.a
,则可以将选项-L /path/to/big_project -l big_project
添加到gcc命令行。
如果项目没有有一个可以链接的库文件(例如它不是库而是可执行程序,你只需要一些可执行程序使用的代码),你可能想尝试让项目的作者创建这样一个库文件(如果他/她熟悉“automake and friends”对他来说应该不会太麻烦),或者自己尝试这样做。
编辑另一个建议:你说项目附带一个makefile。尝试make
使用makefile,看看它的编译器命令行是什么样的。它是否有许多包含和单个目标文件?
答案 1 :(得分:1)
将未开发为库的应用程序视为库是不可行的。作为一个随意的例子,省略main
可能最终会删除你想要的类所依赖的初始化代码。
这里负责的是阅读代码,理解代码,并将所需的功能转换为适当的库。使用调试符号构建“exe您不需要”,并在类的构造函数和方法中设置断点。深入了解它们,以便掌握功能以及程序的哪些部分与您的需求无关。
希望代码在支持分支的某种版本控制系统下(例如Git)。如果没有,请创建自己的存储库。编辑文件,直到将它们组织到库和使用库的代码中。确保它在原始程序的上下文中正常工作。然后转身并在您自己的程序中使用此库。
如果你做得很好,你可能会说服原作者接受分离回原代码库。如果没有,至少版本控制有你的支持,这样你就可以管理未来变化的整合。