CMake是否添加外部项目?

时间:2019-02-18 18:28:21

标签: cmake

我不能完全确定externalproject_Add是否为我可以在其上找到的大多数示例,都是关于下载git etc /,但也许就这样...

基本上我有:

FolderA // inherited project
> main.cpp
> CMakeList.txt
    > libFolder
        >someStuff.h
        >someStuff.cpp

FolderB // base project
> main.cpp
> CMakeList.txt
    > libFolder_Core
        >someStuff_Core.h
        >someStuff_Core.cpp

我不想每次更改文件夹B中的项目时都必须构建static / dynamic / etc lib,我只想在我的文件夹A中包含该文件夹中的CMakeList.txt,FolerB cmake仅包含一些内容喜欢

set(headers xx.h)
set(source xx.cpp)
set(all ${headers} ${source})

只是想在projectA,cmake中说一句话

get_filename_component(libs"${CMAKE_CURRENT_SOURCE_DIR}/.." ABSOLUTE)
SET(coreLib ${libs}/someCoreLib/)
add_executable(name, main.cpp ${coreLib})

有这种可能吗?

1 个答案:

答案 0 :(得分:1)

您可以使用导出的目标和程序包注册表,使用现代CMake轻松地做到这一点。

在项目A中:

add_library(projecta a.cpp b.cpp c.cpp)
add_library(projecta::projecta ALIAS projecta)

target_include_directories(projecta PUBLIC ...)

install(TARGETS projecta EXPORT projectaTargets
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
  INCLUDES DESTINATION include
)

install(
  EXPORT projectaTargets
  NAMESPACE projecta::
  FILE projectaConfig.cmake
  DESTINATION lib/cmake/projecta
)

export(
    EXPORT projectaTargets
    FILE "${CMAKE_CURRENT_BINARY_DIR}/projectaConfig.cmake"
)

export(PACKAGE projecta)

这将成为projecta的目标,并将目标导出给其他项目使用。

如果项目A本身具有依赖项,请考虑将目标导出到目标文件,然后生成一个配置文件,该文件还可以找到依赖项的程序包。在It's Time To Do CMake Right博客文章中有更多相关内容。

然后,在项目B中:

find_package(projecta REQUIRED)

add_executable(projectb x.cpp y.cpp z.cpp)

# link project b to project a,
# adding include directories and link dependencies
target_link_libraries(projectb PUBLIC projecta::projecta)