簡體   English   中英

使用 CMake 對“shm_open”的未定義引用

[英]undefined reference to `shm_open' using CMake

我在 Ubuntu 14.04 下使用 CMake 來配置我的項目。 我需要使用第 3 方庫(比如 stuff.so)。 在 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)

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

target_link_libraries(my_app ${Boost_LIBRARIES} -lrt)

這在使用例如 gcc 編譯器解決要鏈接的缺失庫時達到相同的效果:

gcc my_app.c -o my_app -lrt

正如您可能已經發現的那樣,背后的原因是缺少必需的(“實時”)庫。 為此,您可以通過輸入命令進行檢查

man shm_open

然后找到解釋添加-lrt原因的關鍵片段,即“這些功能在 glibc 2.2 及更高版本中提供。使用這些功能的程序必須將 -lrt 標志指定給 cc 以便鏈接所需的(“實時” ) 圖書館。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM