find_library或link_directories或find_package?有什么更好的方法?错误 - 使用cmake链接库

时间:2013-07-25 11:39:52

标签: cmake gstreamer dynamic-linking shared-libraries

鉴于
文件/usr/lib/gstreamer-0.10/libgstffmpeg.so存在 在CMakeLists.txt中进行更改

方法1 find_library()

  

find_library(GST_FFMPEG NAMES gstffmpeg PATHS /usr/lib/gstreamer-0.10/)
  ...
  target_link_libraries(MyLibraryOrMyExecutable $ {GST_FFMPEG})

当我使用上述配置(方法1)运行make时,我收到以下错误

  

/ bin / ld:警告: libvpx.so.1 ,未找到/usr/lib/i386-linux-gnu/libavcodec.so.53(尝试使用-rpath或-rpath链接)
  / bin / ld:警告: libschroedinger-1.0.so.0 ,未找到/usr/lib/i386-linux-gnu/libavcodec.so.53(尝试使用-rpath或 - rpath的链接)
  / bin / ld:警告: libgsm.so.1 ,未找到/usr/lib/i386-linux-gnu/libavcodec.so.53(尝试使用-rpath或-rpath-链路)

看起来添加的库依赖于更多未链接的库!我可以在/ usr / lib中看到上面3个.so文件。因此,方法1的一种可能解决方案是添加三个find_library()函数。对吗?

可能不是 - This question探讨了上述可能解决方案中发现的问题

  • Q1。有没有其他方法可以节省找到的工作量 依赖库并链接它们?所有依赖库自动链接的方法?

方法2 link_directories()

  

link_directories(/usr/lib/gstreamer-0.10/)
  target_link_libraries(MyLibraryOrMyExecutable gstffmpeg)

当我使用上述配置(方法2)运行make时,我收到以下错误

  

bin / ld:找不到-lgstffmpeg

  • Q2。如何解决上述方法2的问题?
  • Q3。哪种方法1或2更好?

P.S。尝试阅读cmake的文档并在SO上搜索但无法解决我的问题。 我尝试了两种方法并且都存在问题

2 个答案:

答案 0 :(得分:1)

首先回答你的Q3,我认为首选的方法是方法1。

来自link_directories的文档:

  

请注意,此命令很少需要。 find_package()和find_library()返回的库位置是绝对路径。将这些绝对库文件路径直接传递给target_link_libraries()命令。 CMake将确保链接器找到它们。

无论采用哪种方法,我都不知道一种简单的方法来自动获取这些“子依赖项”的列表并添加它们。我只为每个人做find_packagefind_library

至少就是这样,如果找不到依赖项,那么你的项目会在CMake配置时而不是在链接时失败。

答案 1 :(得分:0)

我遇到类似的情况,我通过添加CMakesList.txt解决它,就在find_library()之前,添加此命令:

set(CMAKE_PREFIX_PATH / / path / to / your / lib /)

,但通常如果你的依赖库在usr / lib或usr / local / lib路径中,它可以通过很好地调用函数找到。