使用CMake出现undefined reference to `shm_open'错误

5
我正在Ubuntu 14.04下使用CMake配置我的项目。我需要使用第三方库(比如stuff.so)。在CMakeLists.txt中,我使用TARGET_LINK_LIBRARIES来链接stuff库。然而,我遇到了一个错误:
DIR_TO_LIB/stuff.so:-1: 错误:对`shm_open'的引用未定义。
我尝试将这些标志放入CMakeLists.txt中,但没有起作用:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lrt")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lrt")

一篇帖子(链接)建议将-lrt放在g++的最后一个参数。在我使用CMake的情况下,我该怎么做呢? 更新: 我添加了


SET (CMAKE_VERBOSE_MAKEFILE 1)

我发现即使我把-lrt放在目标链接的末尾,它也不是最后一个。请查看此链接以查看编译输出。

从编译输出中可以看出,有一些opencv的链接标志。我不明白这是怎么发生的,因为我在TARGET_LINK_LIBRARIES中首先链接了OpenCV库。CMake是如何处理这些链接顺序的?

请还参考我的CMakeLists.txt

谢谢。


1
https://dev59.com/0Wcs5IYBdhLWcg3wym_D - πάντα ῥεῖ
2个回答

6

你需要在TARGET_LINK_LIBRARIES中最后添加rt,例如:

TARGET_LINK_LIBRARIES(my_app ${Boost_LIBRARIES} rt)

您可以通过启用详细的构建输出来验证rt的位置。
SET (CMAKE_VERBOSE_MAKEFILE 1)

谢谢你的回答。我尝试了你的解决方案,但它没有起作用。请查看我的更新以获取编译输出和我的CMakeLists。非常感谢。 - linzhang.robot
OpenCV库中的一些库被链接了两次。尝试在ADD_EXECUTABLETARGET_LINK_LIBRARIES之间添加ADD_DEPENDENCIES(vidcapture ${OpenCV_LIBS} Qt5::Widgets Qt5::Multimedia aja ajastuff rt) - doqtor
是的,问题在于opencv被链接了两次。当我从“target_link_libraries”中删除了opencv时,它可以通过编译。我还尝试了“ADD_DEPENDENCIES”,但是出现了相同的错误。 - linzhang.robot

1
首先,答案是:将-lrt附加到您的宏target_link_libraries末尾,用于您的目标my_app,即:
target_link_libraries(my_app ${Boost_LIBRARIES} -lrt)

这可以通过使用例如gcc编译器来解决缺失库的链接问题,从而实现相同的效果:

gcc my_app.c -o my_app -lrt

可能你已经发现了,原因是缺少必需的“realtime”库。你可以通过输入以下命令来检查:

man shm_open

然后找到关键代码片段,解释添加-lrt的原因,即: “这些函数在glibc 2.2及更高版本中提供。使用这些函数的程序必须在cc中指定-rt标志,以便链接所需的(“实时”)库。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接