c++ - cmake:库依赖于另一个库(sqlite3pp)

标签 c++ sqlite cmake git-submodules

我正在尝试链接 cmake sqlite3pp我的应用程序的库,它又依赖于 sqlite。所以依赖关系图如下:

my_app  --> sqlite3pp  --> sqlite

一个工作正常但对于分发来说太笨拙的技巧(我正在使用 git submodule),是将 sqlite 放在 libs/sqlite3pp/源代码:

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引用错误:

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详情

关于c++ - cmake:库依赖于另一个库(sqlite3pp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28560007/

相关文章:

c++ - MySQL 与 C++ 程序

c++ - 在父函数中获取子对象的大小

C# 使用命令行调用应用程序

sql - 包含多个选项的SQL参数化查询

cmake - 通过ExternalProject_Add 使用 pybind11 进行 CMake 项目的智能方法

c++ - 字符串末尾的垃圾字符?

具有首选语言的 SQLite FTS4

ios - Coredata 总是更新行而不是快速插入新行

c++ - 在 WSL : configure_file Problem configuring file 上对 configure_file 的每次调用都失败

CMake 与有关生成的文件