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

时间:2016-09-17 11:01:53

标签: c++ cmake

我无法让我的cmake项目运行。它应该构建一个库(Core),然后将此库添加到新的共享库中。问题是生成的库似乎没有正确链接可执行文件。

fatal error: JNF_NEAT/body.h: No such file or directory


我有一个CMake项目,其结构如下:

root
  -> CMakeLists.txt
  -> Core/
     -> CMakeLists.txt
     -> Sources/
  -> Examples/
     -> CMakeLists.txt
     -> Example1/
        -> CMakeLists.txt
        -> Sources/


根/的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)


根/核心/的CMakeLists.txt

file(GLOB SOURCES Sources/*.cpp Sources/*.h)
add_library(Core OBJECT ${SOURCES})


根/实施例/的CMakeLists.txt

add_subdirectory(XOR)


根/实施例/ XOR /的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)


整个源代码可用here


编辑#1

我尝试在target_include_directories(XOR_EXAMPLE BEFORE PUBLIC ../../out/lib)

之前设置target_link_libraries

我还尝试在最外面的CMakeLists.txt

中设置include_directories(out/lib)


编辑#2

在Linux this上发生错误。

1 个答案:

答案 0 :(得分:2)

错误

  

JNF_NEAT / body.h:没有这样的文件或目录

不是链接错误,而是编译错误。

检查JNF_NEAT/body.h是否确实存在。如果是,它可能不会包含在编译器查找#include的目录列表中。您可以使用include_directories命令在CMake中设置此项。

  

将给定目录添加到编译器用于搜索包含文件的目录中。相对路径被解释为相对于当前源目录。

     

include目录被添加到当前CMakeLists文件的INCLUDE_DIRECTORIES目录属性中。它们还会添加到当前CMakeLists文件中每个目标的INCLUDE_DIRECTORIES目标属性中。目标属性值是生成器使用的值。

     

默认情况下,指定的目录会附加到当前目录列表中。通过将CMAKE_INCLUDE_DIRECTORIES_BEFORE设置为ON,可以更改此默认行为。通过明确使用AFTER或BEFORE,您可以在附加和前置之间进行选择,与默认值无关。