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

标签 c++ cmake

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

some project
    libs
        mylib1
            ...
        3rdlibs1
            ...
    apps
        myapp1
            ...

我的要求如下:

  • 3rdlibs1 应该在使用command 的时候编译。像“cmake -G ...”。
  • 3rdlibs1 应该编译成静态库。
  • mylib1 应该是模块化的。
  • mylib1 依赖于 3rdlibs。
  • myapp 依赖于 mylib1,它应该只链接到 mylib1。它不应依赖于 3rdlibs 或系统库。

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

最佳答案

如果您的所有源都在单个文件系统树中,那么使用 add_subdirectory 比使用 ExternalProject 更好。 ExternalProject 适用于真正外部的项目,例如在远程服务器或 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 的可选依赖项。否则,没有 3rdlibs1,myapp 如何使用 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()

关于c++ - 如何使用cmake编译现代c++项目代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44643586/

相关文章:

c++ - 编译器标志在 CMake CHECK_CXX_COMPILER_FLAG 中检查了两次

c++ - 将文件嵌入到程序中

c++ - 将二维数组传递给 C++ 中的函数时出错

c++ - 如何定义创建前一个对象的默认构造函数

architecture - 如何使用CMake检测目标架构?

c++ - 使用 cmake 打开 cv build 找不到 libjpeg

regex - 在CMake中将字符串的一部分转换为大写

c++ - 如何在 C++ 中将成员变量指针转换为泛型类型

c++ - 类实例的地址是否等于类中唯一元素的地址

c++ - CMake如何使用动态链接库?