将可执行文件链接到第三方依赖共享库时,C++ CMake undefined reference
C++ CMake undefined reference when linking an executable to a third party dependant shared library
我阅读了很多相关主题(例如1, 2, ),但没有自己找到答案,所以我来了。
我有一个构建和可执行的 CMake 项目,比方说 "x"。我创建了一个名为 "a.so" 的共享库,它依赖于另一个名为 "b.so" 的共享库。我想在 "x".
中使用 "a"
这是我的简化版 "x" CMakelists.txt:
SET(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
LINK_DIRECTORIES(${ROOT_DIR}/lib/a/bin/) # contains liba.so
INCLUDE_DIRECTORIES(${ROOT_DIR}/lib/a/include/) # contains "a" headers
ADD_EXECUTABLE(x ${SOURCE})
TARGET_LINK_LIBRARIES(x a)
"x" 编译输出摘录:
Linking CXX executable ../bin/x
/usr/bin/cmake -E cmake_link_script CMakeFiles/x.dir/link.txt --verbose=1
/usr/lib64/ccache/c++ -std=c++0x CMakeFiles/x.dir/src/main /Main.cpp.o
... -L/.../lib/a/bin -rdynamic -la -Wl,-rpath,/.../lib/a/bin
"a" 和 "b" 进行编译。
问题是当我想编译 x 时 linking: undefined reference to 'function name' 时出现错误。
我也尝试过 link 对抗 "b",但它仍然不起作用。
这里也出现了"b"但是我得到了同样的错误...
Linking CXX executable ../bin/x
/usr/bin/cmake -E cmake_link_script CMakeFiles/x.dir/link.txt --verbose=1
/usr/lib64/ccache/c++ -std=c++0x CMakeFiles/x.dir/src/main
/Main.cpp.o -o ../bin/x -L/.../lib/b/bin -L/.../lib/a/bin
-rdynamic -lb -la -Wl,-rpath,/.../lib/b/bin:/.../lib/a/bin
这是错误输出:
$ make
[ 20%] Automatic moc for target x
Linking CXX executable ../bin/x
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params_set_start_threshold'
/.../lib/b/bin/b.so: undefined reference to `snd_seq_delete_simple_port'
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_info_set_device'
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params'
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params_set_silence_threshold'
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_hw_params_any'
/.../lib/b/bin/b.so: undefined reference to `snd_seq_drain_output'
/.../lib/b/bin/b.so: undefined reference to `snd_ctl_pcm_next_device'
...
collect2: error: ld returned 1 exit status
CMakeFiles/x.dir/build.make:163: recipe for target '../bin/x' failed
make[2]: *** [../bin/x] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/x.dir/all' failed
make[1]: *** [CMakeFiles/x.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
make: *** [all] Error 2
我看不出有什么问题,现在我很困惑,因为我尝试了很多方法来使它正常工作...但没有任何效果。
有什么想法吗?
谢谢!
"b" 缺少特定的依赖库。我通过 FIND_PACKAGE
CMake 指令在 "b" CMakeLists.txt 中添加了它。
它解决了问题。
以上"x"CMakeLists.txt是正确的
我在上面的评论中向你询问了错误输出,因为它可以帮助搜索undefined symbols/references。
所以,您的 b.so 似乎找不到 ALSA 库。如果您使用 CMake 3.0(及以上),您可以通过
将其添加到您的 CMakeLists.txt
find_package( ALSA )
并且可以将 ${ALSA_INCLUDE_DIR}
附加到您的包含路径,并将 ${ALSA_LIBRARY}
附加到您的链接器路径。
我阅读了很多相关主题(例如1, 2,
我有一个构建和可执行的 CMake 项目,比方说 "x"。我创建了一个名为 "a.so" 的共享库,它依赖于另一个名为 "b.so" 的共享库。我想在 "x".
中使用 "a"这是我的简化版 "x" CMakelists.txt:
SET(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
LINK_DIRECTORIES(${ROOT_DIR}/lib/a/bin/) # contains liba.so
INCLUDE_DIRECTORIES(${ROOT_DIR}/lib/a/include/) # contains "a" headers
ADD_EXECUTABLE(x ${SOURCE})
TARGET_LINK_LIBRARIES(x a)
"x" 编译输出摘录:
Linking CXX executable ../bin/x
/usr/bin/cmake -E cmake_link_script CMakeFiles/x.dir/link.txt --verbose=1
/usr/lib64/ccache/c++ -std=c++0x CMakeFiles/x.dir/src/main /Main.cpp.o
... -L/.../lib/a/bin -rdynamic -la -Wl,-rpath,/.../lib/a/bin
"a" 和 "b" 进行编译。
问题是当我想编译 x 时 linking: undefined reference to 'function name' 时出现错误。 我也尝试过 link 对抗 "b",但它仍然不起作用。
这里也出现了"b"但是我得到了同样的错误...
Linking CXX executable ../bin/x
/usr/bin/cmake -E cmake_link_script CMakeFiles/x.dir/link.txt --verbose=1
/usr/lib64/ccache/c++ -std=c++0x CMakeFiles/x.dir/src/main
/Main.cpp.o -o ../bin/x -L/.../lib/b/bin -L/.../lib/a/bin
-rdynamic -lb -la -Wl,-rpath,/.../lib/b/bin:/.../lib/a/bin
这是错误输出:
$ make
[ 20%] Automatic moc for target x
Linking CXX executable ../bin/x
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params_set_start_threshold'
/.../lib/b/bin/b.so: undefined reference to `snd_seq_delete_simple_port'
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_info_set_device'
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params'
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params_set_silence_threshold'
/.../lib/b/bin/b.so: undefined reference to `snd_pcm_hw_params_any'
/.../lib/b/bin/b.so: undefined reference to `snd_seq_drain_output'
/.../lib/b/bin/b.so: undefined reference to `snd_ctl_pcm_next_device'
...
collect2: error: ld returned 1 exit status
CMakeFiles/x.dir/build.make:163: recipe for target '../bin/x' failed
make[2]: *** [../bin/x] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/x.dir/all' failed
make[1]: *** [CMakeFiles/x.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
make: *** [all] Error 2
我看不出有什么问题,现在我很困惑,因为我尝试了很多方法来使它正常工作...但没有任何效果。
有什么想法吗?
谢谢!
"b" 缺少特定的依赖库。我通过 FIND_PACKAGE
CMake 指令在 "b" CMakeLists.txt 中添加了它。
它解决了问题。
以上"x"CMakeLists.txt是正确的
我在上面的评论中向你询问了错误输出,因为它可以帮助搜索undefined symbols/references。
所以,您的 b.so 似乎找不到 ALSA 库。如果您使用 CMake 3.0(及以上),您可以通过
将其添加到您的CMakeLists.txt
find_package( ALSA )
并且可以将 ${ALSA_INCLUDE_DIR}
附加到您的包含路径,并将 ${ALSA_LIBRARY}
附加到您的链接器路径。