多个子项目依赖于同一个库

nik*_*ack 7 cmake

我有一个项目main_project。它依赖于两个库 -libAlibB,而这又依赖于lib_common每个库。

以图形方式项目的结构如下所示:

main_project
   |
   +-libA
   |   |
   |   +-CMakeLists.txt
   |
   +-libB
   |   |
   |   +-CMakeLists.txt
   |
   +-lib_common
   |   |
   |   +-CMakeLists.txt
   |
   +-CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

既然libA使用了,那么调用insidelib_common是很自然的。但这也取决于。如果我再次将其放入子目录中,它将编译两次。我不想要这样。另外,我想保持所有子项目的干净和独立 - 这就是为什么我不想放入顶级的(因为没有任何东西)。add_subdirectory(lib_common)libACMakeLists.txtlibBlib_commonlib_commonmain_projectCMakeLists.txtlib_commonmain_project

我有哪些选择?

Aki*_*ira 5

我会为您的项目结构添加一个抽象级别:

\n\n
    \n
  • app- 这适用于可执行文件以及属于它们的所有内容,
  • \n
  • lib- 应用程序的库。
  • \n
\n\n

顶层CMakeLists.txt只会知道有两个不同的东西,app子项目和lib子项目。示例目录结构如下所示:

\n\n
FooProject\n|-- app\n|\xc2\xa0\xc2\xa0 |-- CMakeLists.txt\n|\xc2\xa0\xc2\xa0 `-- src\n|\xc2\xa0\xc2\xa0     `-- foo.cpp\n|-- CMakeLists.txt\n`-- lib\n    |-- CMakeLists.txt\n    |-- libA\n    |\xc2\xa0\xc2\xa0 |-- CMakeLists.txt\n    |\xc2\xa0\xc2\xa0 |-- inc\n    |\xc2\xa0\xc2\xa0 |\xc2\xa0\xc2\xa0 `-- bar.h\n    |\xc2\xa0\xc2\xa0 `-- src\n    |\xc2\xa0\xc2\xa0     `-- bar.cpp\n    |-- libB\n    |\xc2\xa0\xc2\xa0 |-- CMakeLists.txt\n    |\xc2\xa0\xc2\xa0 |-- inc\n    |\xc2\xa0\xc2\xa0 |\xc2\xa0\xc2\xa0 `-- baz.h\n    |\xc2\xa0\xc2\xa0 `-- src\n    |\xc2\xa0\xc2\xa0     `-- baz.cpp\n    `-- lib_common\n        |-- CMakeLists.txt\n        |-- inc\n        |\xc2\xa0\xc2\xa0 `-- common_tool.h\n        `-- src\n            `-- common_tool.cpp\n
Run Code Online (Sandbox Code Playgroud)\n\n

顶层CMakeLists.txt仅包含以下内容:

\n\n
cmake_minimum_required(VERSION 2.8)\nproject(FooProject)\n\nadd_subdirectory(lib)\nadd_subdirectory(app)\n
Run Code Online (Sandbox Code Playgroud)\n\n

应该app/CMakeLists.txt知道有一个lib文件夹,您可以在其中包含标头,并且可执行文件取决于libAlibB

\n\n
project(foo)\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR}/../lib)\naux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src FOO_SOURCES)\n\nadd_executable(foo ${FOO_SOURCES})\nadd_dependencies(foo libA libB)\ntarget_link_libraries(foo libA libB)\n\ninstall(TARGETS foo RUNTIME DESTINATION bin ARCHIVE DESTINATION bin)\n
Run Code Online (Sandbox Code Playgroud)\n\n

的存在是为了将,和lib/CMakeLists.txt联系在一起:libAlibBlib_common

\n\n
cmake_minimum_required(VERSION 2.8)\n\nadd_subdirectory(lib_common)\nadd_subdirectory(libA)\nadd_subdirectory(libB)\n
Run Code Online (Sandbox Code Playgroud)\n\n

假设它lib_common没有依赖项,因此lib/lib_common/CMakeLists.txt不会在其文件夹之外看到:

\n\n
project(lib_common)\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)\naux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src LIBCOMMON_SOURCES)\n\nadd_library(lib_common ${LIBCOMMON_SOURCES})\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此示例中,lib/libA/CMakeLists.txtlib/libB/CMakeLists.txt具有几乎相同的内容,只有它们处理lib_common

\n\n
project(libA)\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc ${CMAKE_CURRENT_SOURCE_DIR}/..)\naux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src LIBA_SOURCES)\n\nadd_library(libA ${LIBA_SOURCES})\nadd_dependencies(libA lib_common)\ntarget_link_libraries(libA lib_common)\n\ninstall(TARGETS libA LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此示例中,lib子项目可以称为干净且独立的项目。

\n