c++ - CMake:target_include_directories() 找不到头文件

标签 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 似乎无法找到 header ,即使我已经明确描述了它在我的文件系统中的位置。根据 target_include_directories() 的文档, 这应该足够了:

Specified include directories may be absolute paths or relative paths. Repeated calls for the same append items in the order called.

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

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

  • 我已经下载了 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 的 header 并链接了 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})

最佳答案

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

因此最好这样写:

set(INCLUDE_DIRS "C:\\Libraries\\64_bit\\SQLite3\\include\\")

或者,更确切地说:

set(INCLUDE_DIRS "C:/Libraries/64_bit/SQLite3/include/")

此外,当前的 CMakeLists.txt 将无法找到 -lsqlite3。值得庆幸的是,CMake 使查找库变得容易:

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

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

# Link project to the SQLite3 library
target_link_libraries(MSP_Tool ${SQLITE3_LIBRARY})

关于c++ - CMake:target_include_directories() 找不到头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43811569/

相关文章:

c - 在 Windows 中为 C 安装编译器?

c++ - 以 0 开头的整数数组元素显示垃圾输出

visual-studio-code - 使用 Visual Studio Code 的 CMake 工具扩展进行构建时删除 -j 4

c++ - C++中的库链接,三个库之间的依赖

c++ - 编译代码时出错,链接器命令失败?

C getchar() 在终端中正常工作,但在 CLion 中不正常

c++ - 为什么我们需要在 C++ 赋值运算符中删除分配的内存?

c++ - boost::any 测试代码可以使用 Sun CC 编译,但不能使用 g++

c++ - OpenCV中基于光流的四边形点跟踪

cmake - 在一个CMake项目中创建几个rpm's (deb's)软件包的最佳方法是什么?