我正在尝试链接到静态库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,他会说它......
答案 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
我在过去遇到类似的情况,发现链接顺序是导致问题的原因。