首页 > 解决方案 > 如何为项目文件夹外的库正确编写 CMakeLists

问题描述

我决定为我的新项目尝试 CMake。我花了几个小时阅读官方文档和教程,所以我获得了一些基本知识,但无法为我的项目编写正确的 CMakeLists。

文件层次结构如下所示:

project
|-- library
|   |-- CMakeLists.txt
|   |-- lib.cpp
|   `-- lib.h
|-- app1
|   |-- CMakeLists.txt
|   |-- app1.cpp
|   |-- app1.h
|   `-- main.cpp
|-- app2
|   |-- CMakeLists.txt
|   |-- app2.cpp
|   |-- app2.h
|   `-- main.cpp
`-- app3
    |-- CMakeLists.txt
    |-- app3.cpp
    |-- app3.h
    `-- main.cpp

关键是我想将该库编译为静态库,以便 app1、app2、app3 等可以使用它。这种结构的原因是每个 appN 都有自己的 main 函数,将在 AWS Lambda 上运行,但我想在库中编写一些它们之间共享的通用代码。

从我到目前为止所阅读的内容来看,如果它位于 appN 的子目录中,则很容易添加一个库add_directory()并将其添加到 中target_link_libraries(),但我无法弄清楚如何添加一个位于 appN 文件夹之外的库。我尝试使用诸如${CMAKE_CURRENT_SOURCE_DIR}/../library/lib.a等之类的相对路径,但随后 CMake 给出了库在项目文件夹之外的错误。

我确信有一些方法可以做到这一点。我已经阅读了一些关于 CMake 模块和的内容find_package(),但我认为对于这个用例来说似乎有点矫枉过正/复杂了?

标签: c++cmake

解决方案


我最终创建了一个主 CMakeLists.txt,其中包含再次具有其 CMakeLists.txt 的子目录。我发现这种方法是最干净的。

如果其他人由此而来,我在下面包含了我完整的 CMakeLists.txt 文件以供参考以及更新的文件层次结构。

文件层次结构

project
|-- CMakeLists.txt
|-- library
|   |-- CMakeLists.txt
|   |-- lib.cpp
|   `-- lib.h
|-- app1
|   |-- CMakeLists.txt
|   |-- app1.cpp
|   |-- app1.h
|   `-- main.cpp
|-- app2
|   |-- CMakeLists.txt
|   |-- app2.cpp
|   |-- app2.h
|   `-- main.cpp
`-- app3
    |-- CMakeLists.txt
    |-- app3.cpp
    |-- app3.h
    `-- main.cpp

CMakeLists.txt

project(MyProject)
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)

add_subdirectory(library)
add_subdirectory(app1)
add_subdirectory(app2)
add_subdirectory(app3)

库/CMakeLists.txt

project(library)
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)

add_library(${PROJECT_NAME} STATIC lib.cpp lib.h)
target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

app1/CMakeLists.txt

project(app1)
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)

add_executable(${PROJECT_NAME} main.cpp app1.cpp app1.h)
target_link_libraries(${PROJECT_NAME} library)

app2/CMakeLists.txt

project(app2)
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)

add_executable(${PROJECT_NAME} main.cpp app2.cpp app2.h)
target_link_libraries(${PROJECT_NAME} library)

app3/CMakeLists.txt

project(app3)
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)

add_executable(${PROJECT_NAME} main.cpp app3.cpp app3.h)
target_link_libraries(${PROJECT_NAME} library)

推荐阅读