我的目录布局如下
projectA/
|-- CMakeLists.txt
|-- src/
|-- main.cpp
projectB/
|-- CMakeLists.txt
|-- src/
|-- file1.cpp
|-- file1.hpp
|-- file2.hpp
|-- main.cpp
|-- third_party/
|-- include
|-- lib1
我可以为projectA
和projectB
构建我的代码(单独),就好了,即两个项目都是自己运行的,彼此独立。
现在,在projectA
我需要使用projectB
中存在的代码(特别是file1.cpp
,file1.hpp
,file2.hpp
和第三方库。
从projectB/src
复制必要的文件,将其粘贴到src
的{{1}}目录并调整projectA
CMakeLists.txt
似乎是不好的做法相应地(通过部分合并projectA
和projectB/CMakeLists.txt
)。
我是否有一种很好的方式可以使用CMake(现在我不确定正确的术语)包括projectA/CMakeLists.txt
中projectB/CMakeLists.txt
定义的项目。我的想法是projectA/CMakeLists.txt
中有关projectB
独立运行的所有内容都在projectB/CMakeLists.txt
中说明,如果我想在projectA
中使用它,我应该无法访问此信息吗?
这可能是一个常见的问题,但我没有在网上找到任何有用的信息,也可能是因为手边没有正确的术语。
答案 0 :(得分:0)
您必须决定所需的封装级别。
export(TARGETS)
或export(EXPORT)
或{{ 1}}或export(PACKAGE)
。install(EXPORT)
add_subdirectory()
include()
,但这实际上是为子目录和您不想更改CMake处理的现有当前目录答案 1 :(得分:0)
您可以使用ExternalProject
模块
https://cmake.org/cmake/help/v3.7/module/ExternalProject.html
假设,projectB是库。然后:
project("A")
include(ExternalProject)
ExternalProject_Add(b_lib
SOURCE_DIR "${B_SOURCE_DIR}"
BINARY_DIR "${B_BUILD_DIR}"
CMAKE_ARGS "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
"-DCMAKE_INSTALL_PREFIX=${B_INSTALL_DIR}"
"-DARBITRARY_VAR=some_value")
add_executable(a_exe src/main.cpp)
target_include_directories(a_exe PRIVATE "${B_INSTALL_DIR}")
target_link_libraries(a_exe "${B_INSTALL_DIR}/b_lib")