CMake:target_include_directories() 找不到头文件

Vla*_*tin 4 c++ cmake clion

在我的main.cpp文件的顶部,No such file or directory被抛出#include <sqlite3.h>.

手动构建代码g++ -I"C:\Libraries\64_bit\SQLite3\include\" -L"C:\Libraries\64_bit\SQLite3\bin\" -lsqlite3 main.cpp Class1.cpp Class1.h Class2.cpp Class2.h -o main不会引发错误。

CMake 似乎无法找到标头,即使我已经明确描述了它在我的文件系统中的位置。根据 的文档target_include_directories(),这应该足够了:

指定的包含目录可以是绝对路径或相对路径。按调用顺序重复调用相同的附加项目。

为什么target_include_directories()即使我提供了确切的绝对路径,该函数也找不到标题?

我正在 64 位 Windows 10 机器上开发,CLion 设置为使用 MinGW-w64g++编译器进行编译。

  • 我已经下载了 64 位 Windows 预编译二进制文件,sqlite3.dll并将其本地存储在C:\Libraries\64_bit\SQLite3\bin\.
  • 为了访问 SQLite C++ 函数,我还下载了 SQLite3 的合并源代码并将所有源文件存储在C:\Libraries\64_bit\SQLite3\include\.

我在 CLion 中构建了我的项目,它本质上是 CMake 的一个花哨的 GUI 包装器。在我的 中CMakeLists.txt,我包含了 SQLite3 的标题并链接sqlite3如下:

cmake_minimum_required(VERSION 3.7)
project(My_Project)

set(CMAKE_CXX_STANDARD 11)

set(INCLUDE_DIRS C:\\Libraries\\64_bit\\SQLite3\\include\\)
set(LIBRARIES sqlite3.dll)
# My project's source code
set(SOURCE_FILES main.cpp Class1.cpp Class1.h Class2.cpp Class2.h)

add_executable(My_Project ${SOURCE_FILES})

# For compiler warnings
target_compile_options(My_Project PRIVATE -Wall)
# Including SQLite3's headers
target_include_directories(My_Project PRIVATE ${INCLUDE_DIRS})
# Linking against sqlite3.dll
target_link_libraries(My_Project ${LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

oLe*_*Len 5

如果不在引号之间放置路径,则可能会遇到问题。

因此,编写以下内容是个好主意:

set(INCLUDE_DIRS "C:\\Libraries\\64_bit\\SQLite3\\include\\")
Run Code Online (Sandbox Code Playgroud)

更确切地说:

set(INCLUDE_DIRS "C:/Libraries/64_bit/SQLite3/include/")
Run Code Online (Sandbox Code Playgroud)

此外,CMakeLists.txt目前的情况将无法找到-lsqlite3. 幸运的是,CMake 使查找库变得容易:

# Optionally, add 'PATHS "C:/Libraries/64_bit/SQLite3/bin/"'
find_library(SQLITE3_LIBRARY NAMES sqlite3)
Run Code Online (Sandbox Code Playgroud)

如果库在您的系统上是可发现的,则上述命令将返回库的路径并将该路径存储在SQLITE3_LIBRARY. 剩下要做的就是将项目链接到 SQLite3 库:

# Link project to the SQLite3 library
target_link_libraries(MSP_Tool ${SQLITE3_LIBRARY})
Run Code Online (Sandbox Code Playgroud)