簡體   English   中英

C ++ CMake將可執行文件鏈接到第三方依賴共享庫時的未定義引用

[英]C++ CMake undefined reference when linking an executable to a third party dependant shared library

我閱讀了大量的相關主題(如123 ),但沒有通過自己找到答案所以我在這里。

我有一個構建和可執行的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是正確的。

我在上面的注釋中詢問了錯誤輸出,因為它可以幫助搜索未定義的符號/引用

所以,似乎你的b.so找不到ALSA庫。 如果你使用CMake 3.0 (及以上版本),你可以通過它將它添加到你的CMakeLists.txt

find_package( ALSA )

並且可以追加${ALSA_INCLUDE_DIR}你的include路徑和${ALSA_LIBRARY}你的連接路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM