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

Using a class from another project in C++

本文关键字:另一个 项目 C++      更新时间:2023-10-16

我有权访问一个大型C++项目,该项目充满了文件,并且由automake&朋友

以下是目录结构的概念。

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

我想使用大项目中的一个类,在say中声明为"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",对他来说应该不会太麻烦),或者尝试自己创建。

EDIT另一个建议是:您说过该项目附带一个makefile。尝试使用makefile对make进行处理,看看它的编译器命令行是什么样子的。它是否也有许多包含和单独的对象文件?

将未作为库开发的应用程序视为库是不可能工作的。作为一个随意的例子,省略main可能最终会剪切出您想要的类所依赖的初始化代码。

在这里,负责任的事情是阅读代码,理解它,并将您想要的功能转化为一个合适的库。使用调试符号构建"不需要的exe",并在类的构造函数和方法中设置断点。进入它们,这样你就可以掌握程序的功能,以及程序的哪些部分与你的需求相关和无关。

希望代码处于某种支持分支的版本控制系统(如Git)下。如果没有,请创建自己的存储库。编辑这些文件,直到您将它们组织成一个库和使用该库的代码。确保它在原始程序的上下文中正常工作。然后转身在你自己的程序中使用这个库。

如果你做得很好,你可能能够说服原始作者接受分离回到他们的原始代码库中。如果没有,至少版本控制支持您,这样您就可以管理未来更改的集成。

相关文章: