Неопределенная ссылка на `shm_open'с использованием CMake
Я использую CMake под Ubuntu 14.04 для настройки своего проекта. Мне нужно использовать стороннюю библиотеку (скажем, 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. Я не понимаю, как это могло произойти, когда я сначала связал библиотеку OpenCV в TARGET_LINK_LIBRARIES. Как CMake обрабатывает этот порядок связывания?
Пожалуйста, смотрите также мой CMakeLists.txt.
Спасибо.
2 ответа
Вам нужно добавить rt
в TARGET_LINK_LIBRARIES
как последний, например:
TARGET_LINK_LIBRARIES(my_app ${Boost_LIBRARIES} rt)
Вы можете проверить положение rt
включив подробный вывод сборки:
SET (CMAKE_VERBOSE_MAKEFILE 1)
Во-первых, ответ: добавить в конец вашего макросаtarget_link_libraries
для вашей целиmy_app
, т.е.
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, чтобы связать требуемую («реального времени») библиотеку».