我有一个项目main_project
。它依赖于两个库 -libA
和libB
,而这又依赖于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)
libA
CMakeLists.txt
libB
lib_common
lib_common
main_project
CMakeLists.txt
lib_common
main_project
我有哪些选择?
我会为您的项目结构添加一个抽象级别:
\n\napp
- 这适用于可执行文件以及属于它们的所有内容,lib
- 应用程序的库。顶层CMakeLists.txt
只会知道有两个不同的东西,app
子项目和lib
子项目。示例目录结构如下所示:
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
仅包含以下内容:
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
文件夹,您可以在其中包含标头,并且可执行文件取决于libA
和libB
:
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
联系在一起:libA
libB
lib_common
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
不会在其文件夹之外看到:
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.txt
和lib/libB/CMakeLists.txt
具有几乎相同的内容,只有它们处理lib_common
:
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
子项目可以称为干净且独立的项目。
归档时间: |
|
查看次数: |
2671 次 |
最近记录: |