【问题标题】:How to properly write CMakeLists for library outside project folder如何为项目文件夹外的库正确编写 CMakeLists
【发布时间】:2020-04-15 14:02:58
【问题描述】:

我决定为我的新项目尝试 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() 的内容,但我认为对于这个用例来说似乎有点矫枉过正/复杂了?

【问题讨论】:

  • "...,但是 CMake 给出了库在项目文件夹之外的错误。" - 你检查过that question 有类似的错误信息,不是吗?
  • 或者您可以为所有使用您的库的项目使用主 cmakelists

标签: c++ cmake


【解决方案1】:

在主 CMakeLists.txt(您创建项目的地方)中不能使用类似的东西吗?

ADD_LIBRARY(MyLib STATIC library/lib.cpp library/lib.h)
ADD_EXECUTABLE(app1 STATIC app1/app1.cpp app1/app1.h)
ADD_EXECUTABLE(app2 STATIC app2/app2.cpp app2/app2.h)
ADD_EXECUTABLE(app3 STATIC app3/app3.cpp app3/app3.h)

TARGET_LINK_LIBRARIES(app1 MyLib)
TARGET_LINK_LIBRARIES(app2 MyLib)
TARGET_LINK_LIBRARIES(app3 MyLib)

【讨论】:

  • 如您在此处所述,从主 CMakeLists.txt 文件开始确实对我有很大帮助,后来导致我创建 CmakeLists.txt 文件等等,正如我在回答中所描述的那样。谢谢!
  • @iQt 太棒了!您应该将您的回答作为答案,以便未来的人可以找到您如何解决问题并将您的问题标记为已解决。
【解决方案2】:

我最终创建了一个主 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)

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2017-02-24
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2021-04-09
    相关资源
    最近更新 更多