如何将2个静态库链接到一个Code :: Blocks项目

时间:2014-08-26 16:15:37

标签: c++ gcc codeblocks

我有3个代码" chunks"对于我的项目:2个静态库:LibraryA和LibraryB,以及一个控制台应用程序:Client。

客户端调用LibraryA,LibraryA调用LibraryB。客户端根本不使用LibraryB。

现在,我已经编译了库A,但是当我尝试编译客户端时,我收到错误,因为它无法找到LibraryB。以下是构建日志所导致的错误:

g++ -L/path/to/LibraryA -L/path/to/LibraryB/ -o bin/Debug/Client obj/Debug/main.o   LibraryA.a "LibraryB.a"
LibraryA.a(LibraryA.o): In function `LibraryA_Class::function(args)':
LibraryA.cpp:136: undefined reference to `namespace::LibraryB::LibraryB_class()'

我不确定问题是什么,感谢任何帮助。 我在Ubuntu 14.04(VirtualBox)中使用Code :: Blocks 13.12和GNU GCC编译器

提前致谢。 如果需要更多信息,请告诉我。

更新

我修改了设置以在开头取出-L命令,所以它现在看起来像这样(带有实际的库名):

g++  -o bin/Debug/Client obj/Debug/main.o   ../../Wrapper/FCS_PlanTrajectory/bin/Debug/libFCS_PlanTrajectory.a ../../BAE/lib_obj/libCMetInterpIf.a
../../Wrapper/FCS_PlanTrajectory/bin/Debug/libFCS_PlanTrajectory.a(PlanTrajectory.o): In function `PlanTrajectory_Class::planSingleTrajectory(unsigned char, Position_T const&, double, double*, Position_T const&, unsigned char, std::vector<agsfirecontrol::METOCGridPoint_T, std::allocator<agsfirecontrol::METOCGridPoint_T> > const&, unsigned char, double, double, double*, Position_T*, double&, double&, unsigned int&, agsfirecontrol::AgsFireControlCompliance_T&)':
/home/angela/Work/FCS/Code/Wrapper/FCS_PlanTrajectory/src/PlanTrajectory.cpp:136: undefined reference to `agsfirecontrol::CMetInterpIf::CMetInterpIf()'
/home/angela/Work/FCS/Code/Wrapper/FCS_PlanTrajectory/src/PlanTrajectory.cpp:193: undefined reference to `agsfirecontrol::CMetInterpIf::~CMetInterpIf()'
/home/angela/Work/FCS/Code/Wrapper/FCS_PlanTrajectory/src/PlanTrajectory.cpp:193: undefined reference to `agsfirecontrol::CMetInterpIf::~CMetInterpIf()' 

LibraryA = PlanTrajectory,LibraryB = CMetInterpIf

如果有任何帮助,那么第二个2错误也一直存在。顺便说一下,我使用相对路径,因为最终我需要将它移植到另一台机器上。如果有任何帮助,我可以改为绝对路径

nm -C libCMetInterpIf.a | fgrep 'agsfirecontrol::CMetInterpIf::CMetInterpIf()'
nm: CEnvironment.o: no symbols
nm: CMetInterpIf.o: no symbols
nm: CMathUtilities.o: no symbols

1 个答案:

答案 0 :(得分:1)

为了成功链接,您需要为链接器提供程序所需的 all 库,包括那些与其他库相关的库。您的客户端程序可能不会直接调用LibraryB中的内容,但它仍然是依赖项,因为LibraryA需要它。试试这个:

g++ -o bin/Debug/Client obj/Debug/main.o /path/to/LibraryA.a /path/to/LibraryB.a

并不需要-L/path/to/libraryA ... LibraryA.a详细程度 - 您可以像上面那样直接命名文件,或者假设您的库使用更标准的{{1}模式命名},您可以使用libA.a - -L/path/to/libraryA ... -lA标记搜索名为-l<something>lib<something>.a的库。