我试图将caffe添加到现有项目中。我得到99个未定义的引用错误,表明它与链接库有关。这些错误提到了caffe,boost和google(与gflags或glog相关)。
链接器命令:( libcaffe位于/ home / torcs / lib)
g++ main.o linuxspec.o -L/home/torcs/export/lib -lopenal -lalut -lvorbisfile -L/usr/lib -L/home/torcs/lib -lracescreens -lrobottools -lclient -lconfscreens -ltgf -ltgfclient -ltxml -lplibul -lraceengine -lmusicplayer -llearning -lplibjs -lplibssgaux -lplibssg -lplibsm -lplibsl -lplibsg -lplibul -lglut -lGLU -lGL -lpng -lz -ldl -lXrandr -lXrender -lXxf86vm -lXmu -lXi -lXt -lSM -lICE -lXext -lX11 -lm -lcaffe -lglog -o torcs-bin
链接器错误(前2和后2):
/home/torcs/export/lib/librobottools.so: undefined reference to `caffe::FillerParameter::_default_type_'
/home/torcs/export/lib/librobottools.so: undefined reference to `void caffe::caffe_gpu_set<float>(int, float, float*)'
...
/home/torcs/export/lib/librobottools.so: undefined reference to `caffe::NetStateRule::NetStateRule()'
/home/torcs/export/lib/librobottools.so: undefined reference to `caffe::Timer::MilliSeconds()'
collect2: error: ld returned 1 exit status
我添加了-lcaffe
并分别尝试了libcaffe.a
和libcaffe.so
,但是当我添加库时,错误数量没有减少。如果我拼错了-lcaff
,它就说找不到libcaffe
,否则它就不会这样做,所以我认为lib正确包含在内。
我阅读了链接器顺序(窗口背景),发现符号只有在必需的符号列表中才会被添加。更具体的库应该是最后的,依赖的库应该是第一个。我想如果我只在末尾添加lcaffe
,则应填充无法识别的符号列表,并且至少会识别caffe符号,并且可能被其他依赖项替换。但这并没有发生。
我试图找出libcaffe
是否提供引用。对于最终未定义的引用(caffe::Timer::MilliSeconds()
),nm libcaffe.a
找到:
0000000000188090 T _ZN5caffe5Timer12MilliSecondsEv
0000000000187910 T _ZN5caffe8CPUTimer12MilliSecondsEv
哪个建议引用在lib中。但未定义的参考错误并没有消失。
我也试过添加boost libs和glog,没有帮助。
编辑。还有一些奇怪的行为正在发生。我认为这是无关的,但我不确定。我在make clean
后第一次构建时收到有关include <random>
的错误:
/usr/include/c++/4.8/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
这可以防止构建o
个文件和librobottools.so
。但是如果我再次make
,那么c ++ 11错误就会消失,这个lib确实会被构建,我会看到99个未定义的引用错误。