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