使用 CMake 对"shm_open"的未定义引用

undefined reference to `shm_open' using CMake

本文关键字:未定义 引用 open shm CMake 使用      更新时间:2023-10-16

我在Ubuntu 14.04下使用CMake来配置我的项目。我需要使用第三方图书馆。在CMakeLists.txt中,我使用TARGET_LINK_LIBRARIES链接素材库。然而,我得到了一个错误:

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.

谢谢。

您需要在TARGET_LINK_LIBRARIES中添加rt作为最后一个,例如:

TARGET_LINK_LIBRARIES(my_app ${Boost_LIBRARIES} rt)

您可以通过启用详细构建输出来验证rt的位置:

SET (CMAKE_VERBOSE_MAKEFILE 1)

首先,答案是:将-lrt附加到目标my_app的宏target_link_libraries的末尾,即

target_link_libraries(my_app ${Boost_LIBRARIES} -lrt)

通过使用例如gcc编译器:,这在解决要链接的丢失库时实现了相同的效果

gcc my_app.c -o my_app -lrt

正如您可能已经发现的那样,背后的原因是缺少所需的("实时")库。为此,您可以通过键入命令进行检查

man shm_open

然后找到解释添加CCD_ 7的原因的密钥片段。,"glibc 2.2及更高版本提供了这些功能。使用这些函数的程序必须将-lrt标志指定为cc,以便链接到所需的("实时")库"