使用CMake构建我的项目我收到以下链接器错误,不知道如何解决它。使用make VERBOSE=1
显示生成的命令对我来说没问题:
azg@HPC:~/code/myproject/build_debug$ /usr/bin/c++ -Wall -Wextra -Wshadow -Woverloaded
-virtual -g3 -ggdb3 -fopenmp CMakeFiles/mymain.dir/main/cpp
/algorithm/mymain.cc.o -o mymain -rdynamic
my_library.a /opt/dev/boost/lib/libboost_filesystem.a /opt/dev/boost
/lib/libboost_graph.a /opt/dev/boost/lib/libboost_system.a /opt/dev/boost
/lib/libboost_program_options.a /opt/dev/boost/lib/libboost_chrono.a /usr/local
/hdf5/lib/libhdf5.so -lz -lrt -ldl -lm /usr/local/cuda-5.0/lib64/libcudart.so -lcuda
/usr/local/cuda-5.0/lib64/libcublas.so /opt/dev/magma/1.4.0-beta2/lib/libmagma.a
/opt/intel/lib/intel64/libimf.so -Wl,-rpath,/usr/local/hdf5/lib:/usr/local/cuda-
5.0/lib64:/opt/intel/lib/intel64/usr/bin/ld:/usr/local/cuda-5.0/lib64/libcublas.so:
和链接器错误:
undefined reference to symbol 'cudaStreamCreate'
/usr/bin/ld: note: 'cudaStreamCreate' is defined in DSO /usr/local/cuda-5.0/lib64/libcudart.so so try adding it to the linker command line
/usr/local/cuda-5.0/lib64/libcudart.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
答案 0 :(得分:3)
链接器错误消息告诉您完全如何解决此问题。
不要将共享库指定为文件,将它们传递给忽略它们的编译器。使用-L将每个库搜索路径传递给链接器,并使用-l将每个库存根名称传递给链接器。链接器将搜索合适的库版本(共享或静态,具体取决于可用的版本和您传递的构建选项),然后将完整的依赖项列表链接在一起。生成的构建命令可能如下所示:
c++ -Wall -Wextra -Wshadow -Woverloaded \
-virtual -g3 -ggdb3 -fopenmp CMakeFiles/mymain.dir/main/cpp \
/algorithm/mymain.cc.o -o mymain -rdynamic my_library.a \
-L/opt/dev/boost/lib \
-L/usr/local/hdf5/lib \
-L/usr/local/cuda-5.0/lib64 \
-L/opt/dev/magma/1.4.0-beta2/lib \
-L/opt/intel/lib/intel64 \
-lboost_filesystem \
-lboost_graph \
-lboost_system \
-lboost_program_options \
-lboost_chrono \
-lhdf5 \
-lz -lrt -ldl -lm \
-lcudart \
-lcuda \
-lcublas \
-lmagma \
-limf
-Wl,-rpath,/usr/local/hdf5/lib:/usr/local/cuda- 5.0/lib64:/opt/intel/lib/intel64/usr/bin/ld
[巨大的免责声明:在拉普兰中间的一个非常脆弱的GSM连接的末尾切割并粘贴在ipad上。不期望实际工作]
我不知道你是如何让Cmake这样做的,而且你没有向我们展示Makefile,因此我可以提供尽可能多的帮助。