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

标签 c++ compilation autotools automake

我可以访问一个大型 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/

相关文章:

c++ - 删除 void 指针时未调用析构函数

c++ - 为什么 eof() 永远不会返回 true?

macros - 如果未设置某些宏,则阻止 systemverilog 编译

c - 如何使生成的自动工具 ./configure 强制 C11 的 _Generic 的可用性?

c - 编译所需的 BLAS 和 LAPACK 库

c++ - 如果线程是从 dll 创建的,std::async 是否会阻止进程退出?

c - 未处理的异常

css - 我可以从不同的来源编译更少的文件吗?

autotools - autoconf 未启用功能...

c++ - C:声明后初始化结构变量