c++ - 如何为项目文件夹外的库正确编写 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()
,但我认为对于这个用例来说似乎有点矫枉过正/复杂了?
解决方案
我最终创建了一个主 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)
推荐阅读
- microsoft-graph-api - Microsoft Graph API - 获取消息 - 收件人别名
- git - 成功推送包含更改的提交后文件未修改
- algorithm - 集合的每个子集的最小和最大元素的 OR 和
- go - golang 取消引用地图
- scala - AnyVal 类型的 AnyRef 等效项
- nginx - nginx 将远程 URL 重定向到本地文件
- c++ - 如何在 c++ 中使用 int* count (const string& s) 计算字符串中每个数字的出现次数?
- sql - 在多个表中使用 union all 时如何删除空行
- python - Python - 如何排序除了一个索引
- python - 绘制实时串行数据时加快 mplotlib