从对象库构建的 CMake 链接共享库

Jer*_*cki 5 c++ cmake

我无法运行我的 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)


整个源代码可在此处获得


编辑 #1

target_include_directories(XOR_EXAMPLE BEFORE PUBLIC ../../out/lib)之前试过设置target_link_libraries

我也尝试include_directories(out/lib)在最外面的 CMakeLists.txt 中设置


编辑 #2

在 Linux 上会发生错误。

Ami*_*ory 3

错误

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,您可以在附加和前置之间进行选择,与默认值无关。