如何使用cmake编译现代c ++项目代码

时间:2017-06-20 03:58:01

标签: c++ cmake

这是我的源代码目录结构。

long lots_of_secs = 1e9;

我的要求如下:

  • 使用命令时应编译3rdlibs1。比如“cmake -G ......”。
  • 3rdlibs1应编译为静态库。
  • mylib1应该是模块化的。
  • mylib1取决于3rdlibs。
  • myapp依赖于mylib1,它应该只链接到mylib1。它不应该依赖于3rdlibs或系统库。

你能给我一些示例代码吗?我知道ExternalProject_Add可以帮助我编译3rdlibs。但我真的不知道该怎么做。 我认为其他人也可能会对这个问题感兴趣。

1 个答案:

答案 0 :(得分:1)

如果您在单个文件系统树中拥有所有来源,则最好使用add_subdirectory而不是ExternalProjectExternalProject用于真正外部的项目,例如在远程服务器或VCS存储库上。与可以创建任何类型目标的add_subdirectory不同,ExternalProject只能创建UTILITY目标,类似于add_custom_target命令。 UTILITY目标有局限性,例如:你不能在target_link_libraries命令中使用它们。使用add_subdirectory要简单得多。 顶层:

cmake_minimum_required(VERSION 3.7)
project("some_project")

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_subdirectory(libs/3rdlibs1)
add_subdirectory(libs/mylib1)
add_subdirectory(apps/myapp1)

应用:

project("myapp1")

set(SRC_FILES ...)
add_executable(myapp1 ${SRC_FILES})
target_link_libraries(myapp1 PRIVATE mylib1)

库。据我所知,3rdlibs1是mylib1的可选依赖项。否则,myapp如何在没有3rdlibs1的情况下使用mylib1?

project("mylib1")

option(THIRD_LIBS_SUPPORT "description" OFF)

set(SRC_FILES ...)
add_library(mylib1 STATIC ${SRC_FILES})
#PUBLIC means that both mylib1 and its dependents use the headers
target_include_directories(mylib1 PUBLIC "${PROJECT_SOURCE_DIR}/include")

if(THIRD_LIBS_SUPPORT)
    #PUBLIC means that 3rdlibs1 will be linked to mylib1 dependents
    target_link_libraries(mylib1 PUBLIC 3rdlibs1)
    target_compile_definitions(mylib1 PUBLIC -DTHIRD_LIBS_SUPPORT)
endif()