【问题标题】:How can I link CMake and SQLite without an external script?如何在没有外部脚本的情况下链接 CMake 和 SQLite?
【发布时间】:2017-05-29 03:29:16
【问题描述】:

我有以下 CMakeLists:

cmake_minimum_required (VERSION 2.8.12.2)
project (Tutorial)
find_package (sqlite3)
if (SQLITE3_FOUND)
  include_directories(${SQLITE3_INCLUDE_DIRS})
  target_link_libraries (new ${SQLITE3_LIBRARIES})
endif (SQLITE3_FOUND)
add_executable(Tutorial new.cpp)

但是,当我 cmake 时,我收到以下消息:

CMake Warning at CMakeLists.txt:3 (find_package):
  By not providing "Findsqlite3.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "sqlite3", but
  CMake did not find one.

  Could not find a package configuration file provided by "sqlite3" with any
  of the following names:

    sqlite3Config.cmake
    sqlite3-config.cmake

  Add the installation prefix of "sqlite3" to CMAKE_PREFIX_PATH or set
  "sqlite3_DIR" to a directory containing one of the above files.  If
  "sqlite3" provides a separate development package or SDK, be sure it has
  been installed.

我还尝试了 thisthis 替代 CMakeLists 文件,但这些都没有奏效。

我也试过了,还是不行:

FIND_PATH(SQLITE3_INCLUDE_DIR NAMES sqlite3.h)
FIND_LIBRARY(SQLITE3_LIBRARY NAMES sqlite)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SQLITE3 DEFAULT_MSG SQLITE3_LIBRARY SQLITE3_INCLUDE_DIR)
IF(SQLITE3_FOUND)
    SET(SQLITE3_LIBRARIES ${SQLITE3_LIBRARY})
    SET(SQLITE3_INCLUDE_DIRS ${SQLITE3_INCLUDE_DIR})
ELSE(SQLITE3_FOUND)
    SET(SQLITE3_LIBRARIES)
    SET(SQLITE3_INCLUDE_DIRS)
ENDIF(SQLITE3_FOUND)

MARK_AS_ADVANCED(SQLITE3_INCLUDE_DIRS SQLITE3_LIBRARIES)

如何在不使用扩展的情况下链接 SQLite?

谢谢!

【问题讨论】:

    标签: c++ sqlite cmake


    【解决方案1】:

    您基本上有两种选择:
    1) 在项目的根目录中名为cmake 的目录中有FindSQLite3.cmake,如下所示FindSQLite3.cmake 你已经尝试过,但你需要有类似下面的东西

    cmake_minimum_required (VERSION 2.8.12.2)
    project (Tutorial)
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
    add_executable(tutorial new.cpp)
    find_package (SQLite3)
    if (SQLITE3_FOUND)
      include_directories(${SQLITE3_INCLUDE_DIRS})
      target_link_libraries (tutorial ${SQLITE3_LIBRARIES})
    endif (SQLITE3_FOUND)
    

    2) 由于您知道 sqlite3 包含目录和库的位置,因此您可以直接设置这些路径,在您的 CMakeLists.txt 中,您将拥有类似 link_directories()include_directories() 的内容,例如你将有以下几行:

    cmake_minimum_required (VERSION 2.8.12.2)
    project (Tutorial)
    add_executable(tutorial new.cpp)
    include_directories(/usr/include)
    link_directories(/usr/lib)
    target_link_libraries(tutorial sqlite3)
    

    沿着这两个方向的东西应该可以工作。
    就个人而言,我会建议第一种方法。

    【讨论】:

    • 如果你使用链接的FindSQLite3.cmake,修改FIND_LIBRARY如下,否则找不到libsqlite3 :# Look for the library. FIND_LIBRARY(SQLITE3_LIBRARY NAMES sqlite3)
    【解决方案2】:

    我刚刚在我的 CMakeLists.txt 文件中添加了以下内容,它可以正常工作。

    find_package (SQLite3)
    
    include_directories(${SQLite3_INCLUDE_DIRS})
    target_link_libraries (${OUT_TARGET} ${SQLite3_LIBRARIES})
    

    cmake 版本 3.14.3

    【讨论】:

    • 不要直接使用变量,而是链接到目标:target_link_libraries (${OUT_TARGET} SQLite3::SQLite3)
    • @valsaysReinstateMonica 您能否详细说明为什么链接到目标更好?或者您能指出我可以阅读该主题的资源吗?
    • @IgNite 这一次,您现在可以在一个地方指定您所依赖的内容(包含/库文件和库的定义很难在逻辑上分开),更容易在预建库并使用您的项目构建它,它通常是 CMake 中的一种现代方式。你也可以看看pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多