C++ CMake:生成或提取共享库所需的头文件
我目前正在做一个更大的项目,但没有得到维护 解释 它尝试使用CMake,但不是很直观。不必包含每个子模块的共享库和头,可以在顶级CMakeList中设置一个标志,触发add_子目录,隐藏顶级CMAKE_BUILD_目录并安装到其中。这些CMakeLists专门使用glob RECUSE查找所有源,大多数操作不是基于目标的,而是全局的。因此,主目标编译正确。下面是主要CMAKEL列表的一个小片段C++ CMake:生成或提取共享库所需的头文件,c++,svn,cmake,export,C++,Svn,Cmake,Export,我目前正在做一个更大的项目,但没有得到维护 解释 它尝试使用CMake,但不是很直观。不必包含每个子模块的共享库和头,可以在顶级CMakeList中设置一个标志,触发add_子目录,隐藏顶级CMAKE_BUILD_目录并安装到其中。这些CMakeLists专门使用glob RECUSE查找所有源,大多数操作不是基于目标的,而是全局的。因此,主目标编译正确。下面是主要CMAKEL列表的一个小片段 set(MY_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") set(
set(MY_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(MY_SOURCE_BASE_DIR "${MY_BASE_DIR}/myproject")
# includes
include(build/global.cmake)
#include(externalLibs/mz-cmaketools-master/global.cmake)
# configuration options
option(MOD1 "" ON)
option(MOD2 "" ON)
option(MOD3 "" OFF)
option(MOD4 "" OFF)
option(MOD5 "" ON)
option(MOD6 "" OFF)
option(MOD7 "" ON)
message("-- Building myproject unit-tests - ${ENABLE_MYPROJECT_TEST}")
set(CMAKE_ECLIPSE_MAKE_ARGUMENTS "-j4")
if(MOD1)
message(STATUS "Building viral_core + viral_recon")
add_subdirectory(${MY_BASE_DIR}/externalLibs/viral/trunk/linux)
include_directories(${MY_BASE_DIR}/externalLibs/viral/trunk/source/)
else(MOD1)
if(MOD3)
message(WARNING "Building viral_core + viral_recon")
add_subdirectory(${MY_BASE_DIR}/externalLibs/viral/trunk/linux)
include_directories(${MY_BASE_DIR}/externalLibs/viral/trunk/source/)
endif(MOD3)
endif(MOD1)
# external libraries
include(${MY_BASE_DIR}/externalLibs.cmake)
include_directories(
${MY_BASE_DIR}
${MY_SOURCE_BASE_DIR}
${MY_BASE_DIR}/externalLibs/viral/trunk/source/
)
# depending on the supported robots we have different dependencies
if( MOD1 )
set(OPT1 TRUE)
endif()
...
# collect binaries
set(LIBRARY_OUTPUT_PATH ${MY_BASE_DIR} CACHE PATH "Library output path")
set(EXECUTABLE_OUTPUT_PATH ${MY_BASE_DIR} CACHE PATH "Executable output path")
message("-- Setting executable output path: ${EXECUTABLE_OUTPUT_PATH}")
message("-- Setting library output path : ${LIBRARY_OUTPUT_PATH}")
# collect sources
file(GLOB MY
"${MY_SOURCE_BASE_DIR}/*.h"
"${MY_SOURCE_BASE_DIR}/*.cpp"
)
source_group(base FILES ${MY_BASE})#
file(GLOB MY_UTIL
"${MY_SOURCE_BASE_DIR}/util/*.h"
"${MY_SOURCE_BASE_DIR}/util/*.cpp"
)
source_group(util FILES ${MY_UTIL})
file(GLOB_RECURSE MY_KINEMATICS
"${MY_SOURCE_BASE_DIR}/kinematics/*.h"
"${MY_SOURCE_BASE_DIR}/kinematics/*.cpp"
)
source_group(kinematics FILES ${MY_KINEMATICS})
file(GLOB MY_COLLISION
"${MY_SOURCE_BASE_DIR}/collision/pqp/*.cpp"
"${MY_SOURCE_BASE_DIR}/collision/PQP*.cpp"
)
source_group(collision FILES ${MY_COLLISION})
...
add_library(MY SHARED
${MY_COLLISION}
${MY_UTIL}
${MY_KINEMATICS}
...}
)
....
最后,项目构建了几个lib,但没有发布使用它们所需的头。这些lib被放入构建目录的顶层。(无安装步骤)
问题
是否有可能使CMake导出库(目标)的包含标头。更准确地说,这些标题应该只位于源文件夹及其下;来自/usr/…的标题。。。不应予以考虑。此外,如果将标题合并为一个标题,则可以接受。但是从1700个标题中,只有40个是相关的,所以简单的查找递归对我来说是不够的
我确实看过GENERATE_EXPORT_头,但我不认为这是我想要的。我没有更改项目的权限,因此我想对SVN存储库进行修补,不想再复制存储库,因为有大约10种不同的版本正在使用
如果您能给我一些解决方案或策略的提示,我将不胜感激
这是我关于stackoverflow的第一个问题,所以请宽容一点:)我希望我正确理解了你的问题 我通常使用为库生成cmake配置文件,如果操作正确,好的方面是,当您使用包配置链接库时,cmake会自动设置可传递的依赖项并包含目录 然后,可以使用该命令将目标、目录、包含文件复制到CMAKE_INSTALL_PREFIX dir,或通过CPack复制到存档中 在宣布我的目标后,我通常会有以下内容:
install(TARGETS MyLibrary
LIBRARY DESTINATION lib
)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${GENERATED_DIR}/MyLibraryConfigVersion.cmake" COMPATIBILITY SameMajorVersion
)
configure_package_config_file(
"cmake/Config.cmake.in"
"${GENERATED_DIR}/MyLibraryConfig.cmake"
INSTALL_DESTINATION "cmake"
)
install(FILES
inc/someHeader.h
inc/someHeaderB.h
DESTINATION include/MyLibrary
)
install(FILES
"${GENERATED_DIR}/MyLibraryConfig.cmake"
"${GENERATED_DIR}/MyLibraryConfigVersion.cmake"
DESTINATION "cmake"
)
然后,您可以将CMAKE\u INSTALL\u PREFIX
设置到您选择的目录,并运行make INSTALL
,创建以下结构:
InstallationDir
├── cmake
│ ├── MyLibraryConfig.cmake
│ └── MyLibraryConfigVersion.cmake
├── include
│ └── MyLibrary
│ ├── someHeaderB.h
│ └── someHeader.h
└── lib
└── MyLibrary.so
然后,您可以在CONFIG
模式下使用find_package
,在链接MyLibrary.so时自动设置包含目录、编译选项等
提示一下:target\u include\u directories
函数比include\u directories
更可取。如果不使用配置文件生成,我不确定它的效果如何。此外,还可以查看以下函数,以便对目标进行更高级的控制:set\u target\u properties
,target\u link\u libraries
,target\u compile\u definitions