Я пытаюсь связаться с cmake
sqlite3pp
библиотека для моего приложения, которое, в свою очередь, зависит от sqlite
, Итак, график зависимости следующий:
my_app --> sqlite3pp --> sqlite
Уловка, которая работает хорошо, но слишком неуклюжа для распространения (я использую git submodule
), это поставить sqlite
внутри libs/sqlite3pp/src
:
project
|___ src # my project
|___ libs # libraries
| |___ sqlite3pp
| | |___ src
| | |___sqlite # I copy it here; clumsy :-(
... ...
Со следующей строкой в sqlite3pp/src/CMakeLists.txt
:
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/sqlite3")
Однако с git submodule
это создает большой беспорядок, так как мне нужно изменить подмодуль. Поэтому я пытаюсь вытащить каталог sqlite
два уровня вверх, в libs
каталог:
project
|___ src # my project
|___ libs # libraries
| |___ sqlite3pp
| |___ src
|
|___ sqlite # Now it looks better
... ...
Теперь два подхода, которые я попробовал, не сработали (я очень новичок в cmake
):
1) когда я заменяю вышеприведенное утверждение
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../sqlite3")
cmake
не распознает относительный путь.
2) Попытка управлять ссылками из project/CMakeLists.txt
подать следующие строки:
set(sqlite_path "${CMAKE_CURRENT_SOURCE_DIR}/libs/sqlite")
include_directories(sqlite_path)
add_subdirectory( sqlite_path )
add_library(sqlite3 STATIC "${CMAKE_CURRENT_SOURCE_DIR}/libs/sqlite/sqlite3.c")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/libs/sqlite3pp/src")
add_subdirectory("libs/sqlite3pp/src")TARGET_LINK_LIBRARIES(sqlite3pp "${CMAKE_CURRENT_SOURCE_DIR}/libs/sqlite/sqlite3.c" )
target_include_directories( sqlite3pp PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/libs/sqlite> )
приводит к ситуации, когда cmake
выглядит успешно, но в make
после успешной компиляции обеих библиотек, связывая их с проектом, я получаю кучу ошибок ‘undefined reference’:
linking CXX executable ../../bin/myapp-1.0.0/myapp
../libs/sqlite3pp/src/libsqlite3pp.so: undefined reference to `pthread_mutex_trylock'
...
Есть идеи?
Для устранения ошибок компоновщика используйте Threads
пакет и CMAKE_THREAD_LIBS_INIT
переменная из него:
find_package(Threads REQUIRED)
target_link_libraries(libsqlite3pp ${CMAKE_THREAD_LIBS_INIT})
Увидеть FindThreads для деталей