我可以访问一个大型 C++ 项目,其中包含大量文件以及由 automake 和 friend 们提供的非常复杂的 makefile
这里是目录结构的概念。
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();
}
我煞费苦心地向 gcc 传递了很多“-I”选项,以便它可以找到所有头文件,从而成功地编译了我的文件
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”,而且这还不够,因为我忘记链接到他碰巧使用的所有库。
otherproject/build/objs/StreamBuffer.h:50: undefined reference to `gzread'
在这一点上,我开始觉得我可能做错了什么。 我应该如何进行?此类问题的常见方法和最佳方法是什么?
我需要它在 Linux 上工作,以防需要完成特定于平台的事情。
最佳答案
通常,项目的.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
编译它,看看它的编译器命令行是什么样子的。它是否也有许多包含文件和单独的目标文件?
关于c++ - 在 C++ 中使用另一个项目中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6286444/