Установите цель cmake, чтобы указать на файл - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь построить внешний проект в CMake; Сама сборка прошла успешно, но мне нужно преобразовать внешнюю библиотеку в цель, так как макрос catkin_make требует LIBRARIES target . Ключевые части моего CMakeLists.txt выглядят так:

set(CERES_INSTALL_INCLUDE_PATH ${CMAKE_INSTALL_PREFIX}/include)
set(CERES_CERES_H_PATH ${CERES_INSTALL_INCLUDE_PATH}/ceres/ceres.h)
file(MAKE_DIRECTORY ${CERES_INSTALL_INCLUDE_PATH}/ceres)

# Based on https://github.com/ethz-asl/ceres_catkin/blob/master/CMakeLists.txt
add_custom_command(OUTPUT ${CERES_CERES_H_PATH} PRE_BUILD
  COMMAND mkdir build || true ; cd build
  COMMAND cd build &&
          cmake .. -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_BUILD_TYPE=Release && make -j8 install
  DEPENDS ${CERES_SOLVER_DIR}
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${CERES_SOLVER_DIR}
)

add_custom_target(ceres_cmake ALL
  DEPENDS ${CERES_CERES_H_PATH}
)

# Fake library to import ceres - use empty source file to keep cmake happy
add_library(${PROJECT_NAME} Empty.c)
add_dependencies(${PROJECT_NAME} ceres_cmake eigen_cmake)
target_link_libraries(${PROJECT_NAME} ${CMAKE_INSTALL_PREFIX}/lib/libceres.a)

Здесь я связываю внешнюю сборку libceres.a, чтобы создать цель. Однако, когда я пытаюсь связать эту библиотеку с другими проектами, я получаю:

/ usr / bin / ld: /whwhat/install/lib/libceres.a(problem_impl.cc.o) : неопределенная ссылка на символ 'pthread_rwlock_wrlock @@ GLIBC_2.2.5' /lib/x86_64-linux-gnu/libpthread.so.0: ошибка добавления символов: DSO отсутствует в командной строке

Я исправляю это , затем я получаю огромный куча ошибок, таких как:

/ home / next-adas3 / pana_feature_release / integrated_pf / install / lib / libceres.a (visibility_based_preconditioner. cc .o): в функции 'ceres :: internal: : VisibilityBasedPreconditioner :: ComputeClusterTridiagonalSparsity (ceres :: internal :: CompressedRowBlockStructure const &) ': visibility_based_preconditioner. cc :(. text + 0x499a): неопределенная ссылка на 'google :: LogMessageFatal :: LogMessageFatal (char const *, int, google :: CheckOpString const &)' visibility_based_preconditioner. cc :(. text + 0x49a2): неопределенная ссылка на «google :: LogMessage :: stream ()» visibility_based_preconditioner. cc :(. text + 0x49aa): неопределенная ссылка на 'google :: LogMessageFatal :: ~ LogMessageFatal ()' visibility_based_preconditioner. cc :(. text + 0x49b7): неопределенная ссылка на 'google :: LogMessageFatal :: ~ LogMessageFatal ()'

Я мог бы продолжить поиск зависимых библиотек, но, похоже, мне, что идеальным решением было бы что-то вроде:

add_file_as_target(${PROJECT_NAME} ${CMAKE_INSTALL_PREFIX}/lib/libceres.a)

Существует ли такая функция? Я попытался:

add_custom_target(${PROJECT_NAME} ALL DEPENDS ${CMAKE_INSTALL_PREFIX}/lib/libceres.a)

Но потом INSTALL пожаловался, что:

Цель "ceres_library" типа UTILITY не может быть связана с другой целью. Можно связать только библиотеки STATI C или SHARED или исполняемые файлы с установленным свойством ENABLE_EXPORTS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...