我想使用 cmake 来安装我的库,edv但是当我执行时:
cmake --build . --target install
Run Code Online (Sandbox Code Playgroud)
它会安装,但只会创建bin/edv.dll和lib/ < empty >。我怎样才能让 cmake 安装在EDV_PUBLIC_INCLUDE_DIRECTORIES里面include/...?
这是我的CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(edv)
# include PUBLIC directories
set(EDV_PUBLIC_INCLUDE_DIRECTORIES include/ )
set(EDV_PRIVATE_INCLUDE_DIRECTORIES src/ )
# Edv source files list
file(GLOB_RECURSE EDV_SOURCE_FILES "src/*.cpp" "src/*.hpp*")
# build the library
add_library(${PROJECT_NAME} SHARED ${EDV_SOURCE_FILES} )
target_include_directories(${PROJECT_NAME} PUBLIC ${EDV_PUBLIC_INCLUDE_DIRECTORIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${EDV_PRIVATE_INCLUDE_DIRECTORIES})
install (TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
PUBLIC_HEADER DESTINATION include
)
Run Code Online (Sandbox Code Playgroud)
CMake 无法从目标推导出要安装的头文件集。这是有道理的,因为目标可能包含私有和公共头文件,但 CMake 不区分它们。因此,您必须在INSTALL(FILES ...)命令中明确列出头文件:
install(FILES ${MY_HEADER_FILES} DESTINATION include)
Run Code Online (Sandbox Code Playgroud)
PUBLIC_HEADER您偶然发现的领域与 OSX 框架机制有关,这是它自己的蠕虫罐。我建议你远离它,除非你真的想.framework在 OSX 上部署你的库。
请特别注意命令的INCLUDES DESTINATION选项INSTALL(TARGET ...)。虽然这实际上并不复制任何文件本身,但它允许将包含目录自动添加到由配置包脚本提供的导入目标。如果您打算向您的用户提供包配置脚本(您可能应该这样做,至少如果您希望您的用户也使用 CMake),您可能想要设置此选项。
由于安装机制总体上相当复杂,我有一个我的小型 github 项目,您可以在其中观察所有元素的运行情况。
要安装./include文件夹中存在的所有标头,您需要做的就是:
设置一个包含所有要安装的头文件的列表(即定义EDV_INCLUDE_FILES),
PUBLIC_HEADER使用所有这些头文件设置目标属性,
将PUBLIC_HEADER参数设置为install(TARGETS ...)安装目录。
这种方法也是 CMake 支持 macOS 框架的基础。
我已经使用设置更新了上面的示例,以./include在项目的目标输出目录中安装项目的公共头文件。警告:我没有亲自测试项目定义,因此它可能需要一些小的调整才能工作。
cmake_minimum_required(VERSION 3.12)
project(edv)
# include PUBLIC directories
set(EDV_PUBLIC_INCLUDE_DIRECTORIES include/ )
set(EDV_PRIVATE_INCLUDE_DIRECTORIES src/ )
# Edv source files list
file(GLOB_RECURSE EDV_SOURCE_FILES "src/*.cpp" "src/*.hpp*")
file(GLOB_RECURSE EDV_INCLUDE_FILES "include/*.hpp*")
# build the library
add_library(${PROJECT_NAME} SHARED ${EDV_INCLUDE_FILES} ${EDV_SOURCE_FILES} )
target_include_directories(${PROJECT_NAME} PUBLIC ${EDV_PUBLIC_INCLUDE_DIRECTORIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${EDV_PRIVATE_INCLUDE_DIRECTORIES})
set_target_properties(${PROJECT_NAME}
PROPERTIES
PUBLIC_HEADER "${EDV_INCLUDE_FILES}"
)
install (TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
PUBLIC_HEADER DESTINATION include
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9202 次 |
| 最近记录: |