我有一个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的方式有问题。
最佳答案
这在评论中得到了回答:
@Clem:与库目标链接时,将使用其INTERFACE_INCLUDE_LIBRARIES属性,该属性包含包含目录Mylib2。通过$使用对象库时,您不会使用任何目标,因此不会消耗任何属性。 –齐瓦列夫