在我的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++编译器进行编译。
sqlite3.dll并将其本地存储在C:\Libraries\64_bit\SQLite3\bin\.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)
如果不在引号之间放置路径,则可能会遇到问题。
因此,编写以下内容是个好主意:
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)