我有一个这样结构的项目:
- CMakeLists.txt
- LibraryProject
-
- CMakeLists.txt
-
- src
- UiProject
-
- CMakeLists.txt
-
- src
我的顶级CMakelists.txt看起来像这样:
project(Project)
add_subdirectory(LibraryProject)
add_subdirectory(UiProject)
我的问题是,'UiProject'依赖于'LibrayProject的'库,在它的CMakeLists.txt我添加了
target_link_libraries(UiProject <absolute path to library>)
它工作得很好,但我想让它的工作没有提供一个绝对的路径那里(特别是因为输出文件夹和库扩展取决于平台),有一种方法来做它使用CMake?像这样:
... in top level CMakeLists.txt
project(Project)
output_path = add_subdirectory(LibraryProject)
add_subdirectory(UiProject, output_path)
... in UiProject's CMakeLists.txt
target_link_libraries(UiProject output_path)
直接添加依赖项。
target_link_libraries(UiProject LibraryProject)
参见CMake Modern介绍中的示例库:https://gitlab.com/CLIUtils/modern-cmake/-/blob/master/examples/extended-project/apps/CMakeLists.txt#L4 .
使用target_link_libraries
链接到项目有多种方式。最简单的一种——也是您可能想要的一种——是通过CMake目标的名称进行链接。
假设在LibraryProject
子目录中定义的目标也称为LibraryProject
,那么您将使用target_link_libraries(UiProject LibraryProject)
。
如果UiProject是一个库,你也应该指定链接的可见性(PUBLIC
如果想要使用UiProject
的接口的东西肯定会想要使用LibraryProject
的接口)。
您可以选择的所有方式:
- 库目标名
- 库文件的完整路径
- 一个普通的库名
- 链接标志
- 计算结果为上述之一的生成器表达式
详细信息请参见文档