将target_include_directories与对象库一起使用

时间:2015-08-06 14:22:14

标签: cmake

我有一个CMake项目,它构建一个依赖于另一个静态库的静态库。我想将此静态库转换为object libraries。当我这样做时,我得到一个编译器错误,我想有一些关于对象库的东西。

这是我想要实现的一个例子。 MyLib和MyLib2都是静态库,MyLib使用在MyLib2中定义和声明的函数。

MyLib
  CMakeList.txt
  MyLib.h
  MyLib.cpp
  MyLib2
    CMakeList.txt
    MyLib2.h
    MyLib2.cpp

MyLib2 /的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project (MyLib2)

add_library(${PROJECT_NAME} OBJECT MyLib2.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

MyLib中/的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project (MyLib)

add_subdirectory(MyLib2)

add_library(${PROJECT_NAME} STATIC MyLib.cpp MyLib.h)
target_link_libraries(${PROJECT_NAME} MyLib2)

MyLib.h包含MyLib2.h以使用它声明的函数。

#ifndef MyLib
#define MyLib

#include "MyLib2.h"

#endif

当MyLib2构建为静态库时,我可以毫无问题地构建代码(我在Mac上使用make和clang)。但是,当我将MyLib2转换为对象库时,我收到一条编译错误,指出无法找到MyLib2.h。

MyLib.h:4:10: fatal error: 'MyLib2.h'file not found

当MyLib2是对象库时,以下是CMake文件的内容。

MyLib2 /的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project (MyLib2)

add_library(${PROJECT_NAME} OBJECT MyLib2.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

MyLib中/的CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project (MyLib)

add_subdirectory(MyLib2)

add_library(${PROJECT_NAME} STATIC MyLib.cpp $<TARGET_OBJECTS:MyLib2>)

当MyLib2是一个对象库时,我不明白为什么MyLib不再是MyLib2.h。也许使用target_include_directories的方式有问题。

1 个答案:

答案 0 :(得分:1)

评论中回答了这个问题:

@Clem:当您与libary目标链接时,您将使用其INTERFACE_INCLUDE_LIBRARIES属性,该属性包含包含目录Mylib2。当您通过$使用对象库时,不使用任何目标,因此不要使用任何属性。 - Tsyvarev