[英]C++ CMake undefined reference when linking an executable to a third party dependant shared library
我閱讀了大量的相關主題(如1 , 2 , 3 ),但沒有通過自己找到答案所以我在這里。
我有一個構建和可執行的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時我在鏈接時遇到錯誤:未定義引用'函數名'。 我試圖鏈接“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”缺少特定的依賴庫。 我通過“b”CMakeLists.txt中的FIND_PACKAGE
CMake指令添加了它。 它解決了這個問題。
因此上面的“x”CMakeLists.txt是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.