C++ CMake:生成或提取共享库所需的头文件

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(

我目前正在做一个更大的项目,但没有得到维护

解释 它尝试使用CMake,但不是很直观。不必包含每个子模块的共享库和头,可以在顶级CMakeList中设置一个标志,触发add_子目录,隐藏顶级CMAKE_BUILD_目录并安装到其中。这些CMakeLists专门使用glob RECUSE查找所有源,大多数操作不是基于目标的,而是全局的。因此,主目标编译正确。下面是主要CMAKEL列表的一个小片段

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