使用C ++中另一个项目的类

时间:2011-06-08 23:23:19

标签: c++ compilation autotools automake

我可以访问一个大型的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上运行,以防需要特定于平台。

2 个答案:

答案 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)。如果没有,请创建自己的存储库。编辑文件,直到将它们组织到库和使用库的代码中。确保它在原始程序的上下文中正常工作。然后转身并在您自己的程序中使用此库。

如果你做得很好,你可能会说服原作者接受分离回原代码库。如果没有,至少版本控制有你的支持,这样你就可以管理未来变化的整合。