【问题标题】:Run make install command in cmake from another cmake file从另一个 cmake 文件在 cmake 中运行 make install 命令
【发布时间】:2020-01-17 17:44:41
【问题描述】:

我们在不同的文件夹中有多个库,主应用程序需要在其他文件夹中构建这些库并将它们安装到输出文件夹,然后主应用程序需要链接到库以构建可执行文件。

我能够在循环中使用 add_subdirectory() 构建其他文件夹中存在的库,但我无法通过主 cmake 文件将它们安装到输出文件夹。谁能帮我解决这个问题。

【问题讨论】:

  • 请发布一些您已经尝试过的代码。

标签: makefile cmake add subdirectory make-install


【解决方案1】:

主应用程序需要在其他文件夹中构建这些库并将它们安装到输出文件夹,然后主应用程序需要链接到库以构建可执行文件。

在 CMake 中无需安装库即可链接到它们。您可以构建库并在不安装库的情况下将主可执行文件链接到它们。当您需要将应用程序作为一个整体安装时,您可以根据需要安装库以及可执行文件,即如果库是共享库而不是静态库。

如何组织事物的一个示例:假设您的项目中具有以下结构:

CMakeLists.txt  # root of project
  |
  |--lib 
  |   |--CMakeLists.txt  # library subproject
  |
  |--app
      |--CMakeLists.txt  # app subproject

那么你的根CMakeLists.txt 可以如下所示:

project(MyProject)

add_subdirectory(lib)
add_subdirectory(app)

lib 子项目的 CMakeLists.txt 可能如下所示:

project(MyLib)

set(SOURCES <...>) # specify library's sources
add_library(${PROJECT_NAME} ${SOURCES})

set(MyLib ${PROJECT_NAME} CACHE INTERNAL "")

上面 sn-p 中的最后一行旨在使 MyLib 变量在项目中的任何地方都可用。我发现了这个技巧here 并在我的项目中成功使用了它。也许这里有更好的选择,如果有人知道,请随时提出建议。

应用程序的CMakeLists.txt 可能如下所示:

project(MyApp)

set(SOURCES <...>) # specify app's sources
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} ${MyLib})

我没有在这里介绍安装,但它实际上很简单:如果您的库是静态库,您只需要使用install TARGETS 安装可执行文件。如果您的库是共享库,则需要将它们与可执行文件一起安装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2017-11-14
    • 2014-11-29
    • 2013-01-24
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多