虽然名称存在,但静态链接失败

时间:2011-05-11 12:41:32

标签: c++ gcc static hyperlink

我正在尝试链接到静态库libcovis.a。一切都很好,但我还是有

  

对'CoViG_PublicDemo :: MoInS :: reset()'

的未定义引用

我检查了名称中存在的名称

  

$ nm libcovis.a | grep reset

     

...

     

_ZN16CoViG_PublicDemo5MoInS5resetEv

     

...

我正在使用链接参数-L / path / to / libcovis.a -lcovis

我做错了什么?

编辑: 错误可能是其他的,如果

  

gcc main.cpp -I / usr / include / opencv -I / usr / include / cairo -I ../../ Source -o slam -rdynamic -lGLU -lGL -lSM -lICE -lX11 -lXext - lglut -lXi -lxml2 -lboost_filesystem-mt -llapack -lblas -lcv -lcxcore -lcvaux -lhighgui -lcairo ../../Source/libcovis.a ../../Source/contrib/gnuplot_i/libcovis_contrib_gnuplot_i.a - lgl2ps

有效!

但是当我使用cmake进入KDevelop时,我不再工作了。我用

  

CMAKE_EXE_LINKER_FLAGS:STRING = -rdynamic -lGLU -lGL -lSM -lICE -lX11 -lXext -lglut -lXi -lxml2 -lboost_filesystem-mt -llapack -lblas -lcv -lcxcore -lcvaux -lhighgui -lloiro / usr / local / src / CoViS-0.0.0-1 / Source / libcovis.a /usr/local/src/CoViS-0.0.0-1/Source/contrib/gnuplot_i/libcovis_contrib_gnuplot_i.a -lgl2ps

     

CMAKE_CXX_FLAGS:STRING = -I / usr / local / src / CoViS-0.0.0-1 / Source -I / usr / include / opencv -I / usr / include / cairo

我能看到的唯一区别是路径是绝对的而不是相对的,但是如果他找不到lib,他会说它......

3 个答案:

答案 0 :(得分:4)

有两个不同的问题,第一个是最简单的,你使用了错误的编译器选项。 -L选项告诉链接器在查找库时也查看目录。 -l告诉它链接特定的库。要链接,您将使用:

  

g ++ -o test test.o -L / path / to -lcovis

  

g ++ -o test test.o -l / path / to / libcovis.a

如果同一个库作为动态库存在于同一目录中,则强制进行静态链接。

第二个潜在问题是链接器命令行中静态库的顺序很重要,因此如果存在对不同静态库的依赖性,这也可能是一个问题。

  

g ++ -o test tests.o -ldependent -lprovider

链接器将按顺序处理库,因为它们位于命令行中,并且从每个静态库中它只会提取所需的符号(具有链接器当时具有的信息)。在上面的命令行中,链接器将从dependent中提取test.o所需的符号,这可能反过来向程序添加新的未定义符号(dependent的依赖关系)。当它处理provider时,它将填写这些符号。如果在命令行中颠倒了顺序,则dependent而不是test.o所需的符号将不会添加到可执行文件中,因为链接器不知道在需要时将需要这些符号处理provider

答案 1 :(得分:2)

参数应该像-L/path/to/ -lcovis吗?

此外,目标文件应放在libs之前,例如

g++ obj1.o obj2.o -L/path/to/ -lcovis

答案 2 :(得分:0)

如果你看到链接在一个上下文中成功而不是另一个上下文,我怀疑问题可能是由链接操作的执行顺序引起的,因为链接器将丢弃库中的符号,如果它们不需要引用库的点。

以下链接说明:http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html

我在过去遇到类似的情况,发现链接顺序是导致问题的原因。