CMake:target_include_directories() 找不到头文件。

7
在我的main.cpp文件顶部,#include <sqlite3.h>处抛出了No such file or directory的错误。
通过手动构建代码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机器上开发,并使用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的头文件并链接了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})

1
CMake在内部使用/作为目录分隔符。你可以尝试使用它来代替\\吗? - Angew is no longer proud of SO
@Angew 刚试了一下,没有改变任何东西。不过还是好知道——我原以为文件分隔符会因系统而异。 - Vladislav Martin
使用CMake的全部意义在于实现系统无关。 - Angew is no longer proud of SO
1
如果在后台CMake生成了一个Makefile,请尝试使用“VERBOSE=1 make”命令查看正在调用哪个命令。此外,尝试将INCLUDE_DIRS的路径设置在引号“”之间。 - oLen
1
这是因为cmake是一个可怕的垃圾,两年前遇到同样的问题,在这里问了20个问题后仍然没有解决。完全放弃它后一切都好了。(双引号对我不起作用) - BadZen
显示剩余4条评论
1个回答

6

如果你没有将路径加上引号,可能会遇到问题。

因此,最好写成:

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})

编辑后包含我找到.dll的附加部分,现在头文件已经处理好了(根据您的答案,这就是我问题所问的)。已接受 :) - Vladislav Martin
我已经折腾了两天的CMake,结果发现我只是漏写了一对双引号!?谢谢你啊! - off99555

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接