使用 CMake 对"shm_open"的未定义引用
undefined reference to `shm_open' using CMake
我在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,以便链接到所需的("实时")库"
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用