我有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
答案 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
的库。