我们在不同的文件夹中有多个库,主应用程序需要在其他文件夹中构建这些库并将它们安装到输出文件夹,然后主应用程序需要链接到库以构建可执行文件。
我可以在循环中使用 add_subdirectory() 构建其他文件夹中存在的库,但我无法通过主 cmake 文件将它们安装到输出文件夹。谁能帮我解决这个问题。
我们在不同的文件夹中有多个库,主应用程序需要在其他文件夹中构建这些库并将它们安装到输出文件夹,然后主应用程序需要链接到库以构建可执行文件。
我可以在循环中使用 add_subdirectory() 构建其他文件夹中存在的库,但我无法通过主 cmake 文件将它们安装到输出文件夹。谁能帮我解决这个问题。
主应用程序需要在其他文件夹中构建这些库并将它们安装到输出文件夹,然后主应用程序需要链接到库以构建可执行文件。
在 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 "")
上面代码片段的最后一行旨在使MyLib
变量在项目中的任何地方都可用。我在这里找到了这个技巧,并在我的项目中成功使用了它。也许这里有更好的选择,如果有人知道,请随时提出建议。
该应用程序CMakeLists.txt
可以如下所示:
project(MyApp)
set(SOURCES <...>) # specify app's sources
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} ${MyLib})
我没有在这里介绍安装,但它实际上很简单:如果你的库是静态库,你只需要使用install TARGETS安装可执行文件。如果您的库是共享库,则需要将它们与可执行文件一起安装。