我正在尝试将 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
,它会说 cannot find libcaffe
,否则它不会这样做,所以我猜该 lib 被正确包含。
我阅读了链接器顺序(windows 背景),发现只有在所需符号列表中才添加符号。更具体的库应该放在最后,依赖库应该放在首位。我想如果我只lcaffe
在末尾添加,应该填充无法识别的符号列表,并且至少可以识别 caffe 符号,并且可能会被其他依赖项替换。但这不会发生。
我试图找出是否libcaffe
提供参考。对于最终的未定义引用 ( caffe::Timer::MilliSeconds()
),nm libcaffe.a
找到:
0000000000188090 T _ZN5caffe5Timer12MilliSecondsEv
0000000000187910 T _ZN5caffe8CPUTimer12MilliSecondsEv
这表明参考文献在库中。但是未定义的引用错误并没有消失。
我还尝试添加 boost libs 和 glog,但没有帮助。
编辑。还有一些额外的奇怪行为正在发生。我认为这无关,但不确定。我在 a 之后第一次构建时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 错误消失了,这个库确实得到了构建,我看到了 99 个未定义的引用错误。