2011-05-08 31 views
2

我有一个使用Boehm GC的项目,所以我想我可能会使用它附带的cord字符串库。问题是我所有对cord函数的调用都会导致“未定义参考”错误。Boehm GC附带的“线”库导致了未定义的参考错误

我在/usr/lib(这是一个Linux系统)中有一个名为libcord.so的文件,我告诉CMake将目标链接到gccord

CMakeLists.txt

target_link_libraries(lang gc) 
target_link_libraries(lang cord) 

从错误消息::响应


编辑以#1评论

../lib/liblang.so: undefined reference to `CORD_substr(char const*, unsigned long, unsigned long)' 
../lib/liblang.so: undefined reference to `CORD_len(char const*)' 
../lib/liblang.so: undefined reference to `CORD_cat(char const*, char const*)' 
../lib/liblang.so: undefined reference to `CORD_cmp(char const*, char const*)' 
../lib/liblang.so: undefined reference to `CORD_to_char_star(char const*)' 

编辑回应评论#2:

$ make -j4 VERBOSE=1 
/usr/bin/cmake -H/home/michael/Projects/lang -B/home/michael/Projects/lang/build --check-build-system CMakeFiles/Makefile.cmake 0 
/usr/bin/cmake -E cmake_progress_start /home/michael/Projects/lang/build/CMakeFiles /home/michael/Projects/lang/build/CMakeFiles/progress.marks 
/usr/bin/make -f CMakeFiles/Makefile2 all 
make[1]: Entering directory `/home/michael/Projects/lang/build' 
/usr/bin/make -f lib/CMakeFiles/lang.dir/build.make lib/CMakeFiles/lang.dir/depend 
make[2]: Entering directory `/home/michael/Projects/lang/build' 
cd /home/michael/Projects/lang/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/michael/Projects/lang /home/michael/Projects/lang/lib /home/michael/Projects/lang/build /home/michael/Projects/lang/build/lib /home/michael/Projects/lang/build/lib/CMakeFiles/lang.dir/DependInfo.cmake --color= 
make[2]: Leaving directory `/home/michael/Projects/lang/build' 
/usr/bin/make -f lib/CMakeFiles/lang.dir/build.make lib/CMakeFiles/lang.dir/build 
make[2]: Entering directory `/home/michael/Projects/lang/build' 
make[2]: Nothing to be done for `lib/CMakeFiles/lang.dir/build'. 
make[2]: Leaving directory `/home/michael/Projects/lang/build' 
/usr/bin/cmake -E cmake_progress_report /home/michael/Projects/lang/build/CMakeFiles 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 
[ 94%] Built target lang 
/usr/bin/make -f src/CMakeFiles/main.dir/build.make src/CMakeFiles/main.dir/depend 
make[2]: Entering directory `/home/michael/Projects/lang/build' 
cd /home/michael/Projects/lang/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/michael/Projects/lang /home/michael/Projects/lang/src /home/michael/Projects/lang/build /home/michael/Projects/lang/build/src /home/michael/Projects/lang/build/src/CMakeFiles/main.dir/DependInfo.cmake --color= 
make[2]: Leaving directory `/home/michael/Projects/lang/build' 
/usr/bin/make -f src/CMakeFiles/main.dir/build.make src/CMakeFiles/main.dir/build 
make[2]: Entering directory `/home/michael/Projects/lang/build' 
Linking CXX executable lang 
cd /home/michael/Projects/lang/build/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=1 
/usr/bin/c++  CMakeFiles/main.dir/main.cpp.o -o lang -rdynamic ../lib/liblang.so -lgc -lcord -lgmp -Wl,-rpath,/home/michael/Projects/lang/build/lib 
../lib/liblang.so: undefined reference to `CORD_substr(char const*, unsigned long, unsigned long)' 
../lib/liblang.so: undefined reference to `CORD_len(char const*)' 
../lib/liblang.so: undefined reference to `CORD_cat(char const*, char const*)' 
../lib/liblang.so: undefined reference to `CORD_cmp(char const*, char const*)' 
make[2]: Leaving directory `/home/michael/Projects/lang/build' 
make[1]: Leaving directory `/home/michael/Projects/lang/build' 
../lib/liblang.so: undefined reference to `CORD_to_char_star(char const*)' 
collect2: ld returned 1 exit status 
make[2]: *** [src/lang] Error 1 
make[1]: *** [src/CMakeFiles/main.dir/all] Error 2 
make: *** [all] Error 2 
+0

,请复制粘贴在命令行CMake的运行时,它链接,和实际产出。 – 2011-05-08 20:35:59

+0

对,现在你可以在详细模式下运行CMake或者其他东西来获得对gcc的实际调用或者它产生的任何东西吗?我想看看正在运行的命令,而不是CMake规则文件。 – 2011-05-08 21:01:53

回答

2

从我所看到的,cord.h文件似乎并没有包含在它extern "C"语句,所以当你正在编译的名字改编正在做正确使用C++编译器的liblang.so

在源在那里你#include <cord.h>你可能需要的东西,如:

extern "C" { 
#include "cord.h" 
} 
+0

我实际上是在我的源文件中编写了原型,因为我的系统由于某种原因没有'cord.h'。尽管如此,“外部”C“”原型固定它。 – mtk358 2011-05-09 00:11:32

0

这可能会帮助您解决问题的CMake:

set_target_properties(<your target> 
    PROPERTIES 
    LINKER_LANGUAGE C)