Я пытаюсь построить внешний проект в 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.