cmake:库依赖于另一个库(sqlite3pp)
cmake: library dependent on another library (sqlite3pp)
我正在尝试将 link 与 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
文件管理 linking:
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
成功编译两个库后,当 link 将它们添加到项目时,我收到一堆 '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
我正在尝试将 link 与 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
文件管理 linking:
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
成功编译两个库后,当 link 将它们添加到项目时,我收到一堆 '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