【问题标题】:C++ CMake undefined reference when linking an executable to a third party dependant shared library将可执行文件链接到第三方相关共享库时的 C++ CMake 未定义引用
【发布时间】:2015-05-28 03:04:02
【问题描述】:

我阅读了很多相关主题(如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.so。您也应该将其添加到链接器路径中。你能粘贴一些编译器/链接器的输出吗?
  • 完成。实际上,“b”不会出现在链接器路径中。但即使我添加 LINK_DIRECTORIES(${ROOT_DIR}/lib/b/bin/)TARGET_LINK_LIBRARIES(x b a) 我也会遇到同样的错误......
  • 这也很好,但是对于 output 我实际上是指错误消息。
  • 好的,完成 ;) 我输入的输出比真实输出短。只是让您知道,实际上我的库 b 指的是名为 juce 的库。
  • 您的b.so 似乎找不到 ALSA 库。

标签: c++ linker cmake shared-libraries juce


【解决方案1】:

我在上面的cmets中询问了你的错误输出,因为它可以帮助搜索undefined symbols/references

所以,您的 b.so 似乎找不到 ALSA 库。如果您使用CMake 3.0(及以上),您可以通过

将其添加到您的CMakeLists.txt
find_package( ALSA )

并且可以将${ALSA_INCLUDE_DIR} 附加到您的包含路径,并将${ALSA_LIBRARY} 附加到您的链接器路径。

【讨论】:

    【解决方案2】:

    “b”缺少特定的依赖库。我通过“b”CMakeLists.txt 中的FIND_PACKAGE CMake 指令添加了它。 它解决了这个问题。

    因此上面的“x”CMakeLists.txt 是正确的。

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2019-02-12
      相关资源
      最近更新 更多