我无法运行我的 cmake 项目。它应该构建一个库(Core),然后将该库添加到一个新的共享库中。问题是生成的库似乎没有正确链接到可执行文件。
fatal error: JNF_NEAT/body.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我有一个 CMake 项目,其结构如下:
root
-> CMakeLists.txt
-> Core/
-> CMakeLists.txt
-> Sources/
-> Examples/
-> CMakeLists.txt
-> Example1/
-> CMakeLists.txt
-> Sources/
Run Code Online (Sandbox Code Playgroud)
根/CMakeLists.txt
cmake_minimum_required(VERSION 3.2.2)
project(JNF_NEAT)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/examples)
add_subdirectory(Core)
add_library(JNF_NEAT SHARED $<TARGET_OBJECTS:Core>)
target_link_libraries(JNF_NEAT -lstdc++fs)
add_subdirectory(Examples)
Run Code Online (Sandbox Code Playgroud)
根/核心/CMakeLists.txt
file(GLOB SOURCES Sources/*.cpp Sources/*.h)
add_library(Core OBJECT ${SOURCES})
Run Code Online (Sandbox Code Playgroud)
根/示例/CMakeLists.txt
add_subdirectory(XOR)
Run Code Online (Sandbox Code Playgroud)
根/示例/异或/CMakeLists.txt
include_directories(../../out/lib)
file(GLOB SOURCES Sources/*.cpp Sources/*.h)
add_executable(XOR_EXAMPLE ${SOURCES})
target_link_libraries(XOR_EXAMPLE JNF_NEAT)
Run Code Online (Sandbox Code Playgroud)
整个源代码可在此处获得。
我target_include_directories(XOR_EXAMPLE BEFORE PUBLIC ../../out/lib)之前试过设置target_link_libraries
我也尝试include_directories(out/lib)在最外面的 CMakeLists.txt 中设置
在 Linux 上会发生此错误。
错误
JNF_NEAT/body.h:没有这样的文件或目录
不是链接错误,而是编译错误。
检查是否JNF_NEAT/body.h确实存在。如果是,它可能不会包含在编译器查找 s 的目录列表中#include。您可以使用以下include_directories命令在 CMake 中进行设置。
将给定目录添加到编译器用来搜索包含文件的目录中。相对路径被解释为相对于当前源目录。
包含目录将添加到当前 CMakeLists 文件的 INCLUDE_DIRECTORIES 目录属性中。它们还会添加到当前 CMakeLists 文件中每个目标的 INCLUDE_DIRECTORIES 目标属性中。目标属性值是生成器使用的值。
默认情况下,指定的目录将附加到当前目录列表中。可以通过将 CMAKE_INCLUDE_DIRECTORIES_BEFORE 设置为 ON 来更改此默认行为。通过显式使用 AFTER 或 BEFORE,您可以在附加和前置之间进行选择,与默认值无关。