我正在使用cmake编译我的一个工作项目,这是交易
-
client/
CMakeLists.txt
server/
CMakeLists.txt
libs/
libstuff/
CMakeLists.txt
CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
所以我希望能够单独编译每个子项目,并从根文件夹构建客户端和服务器.
假设客户端和服务器需要libstuff.
我尝试在客户端和服务器CMakeLists.txt中使用"add_subdirectory"和lib的路径,它在编译服务器或客户端时有效,但是如果您尝试从根目录运行两者:
CMake Error at common/libplugin/CMakeLists.txt:33 (ADD_LIBRARY):
add_library cannot create target "plugin" because another target with the
same name already exists. The existing target is a static library created
in source directory "/home/adrien/git/r-type/common/libplugin". See
documentation for policy CMP0002 for more details.
Run Code Online (Sandbox Code Playgroud)
所以我是一个新的w/cmake,我不知道我应该做什么,我应该使用add_dependencies?
谢谢你的帮助,
我有一个依赖于3个库A,B和C的项目.A和B是基于CMake的git repos,它们都依赖于C,因此将其作为子模块包含(但不同版本的不同版本).所以我的项目结构如下:
ext/
libA/
libC/ (submodule of libA repo)
...
libB/
libC/ (submodule of libB repo)
...
main.cpp
CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
CMakeLists.txt看起来像这样:
add_subdirectory("ext/libA")
add_subdirectory("ext/libB")
add_executable(MyApp main.cpp)
target_include_directories(MyApp ...)
target_link_library(MyApp libA libB libC)
Run Code Online (Sandbox Code Playgroud)
处理这种嵌套的公共依赖项的最佳方法是什么?理想情况下,我会为libA,libB和我的项目使用单个版本的libC,但我不知道这样做的非侵入方式(即没有修改libA和libB的cmake文件).
我非常喜欢子模块和CMake add_subdirectory的组合,因为它简单而干净,但嵌套的依赖项很棘手.
考虑以下三个项目。
ProjectA没有任何依赖关系,其CMakeLists.txt顶层如下所示,
cmake_minimum_required(VERSION 2.8.4)
project(A CXX)
add_library(a ${PROJECT_SOURCE_DIR}/liba.cpp)
Run Code Online (Sandbox Code Playgroud)
ProjectB取决于ProjectA,我将其添加ProjectA为git-submodule,因此其结构如下所示,
ProjectB
CMakeLists.txtlibb.cppProjectA (git子模块)
CMakeLists.txtliba.cpp和ProjectB的CMakeLists.txt如下所示
cmake_minimum_required(VERSION 2.8.4)
project(B CXX)
add_subdirectory(ProjectA)
add_library(b ${PROJECT_SOURCE_DIR}/libb.cpp)
target_link_libraries(b a)
Run Code Online (Sandbox Code Playgroud)
到目前为止,还好。
现在,我们说它来了ProjectC。它取决于ProjectA和ProjectB。并假设我不知道该ProjectB依赖关系ProjectA已经存在(例如,我之前没有创建过这两个ProjectC依赖关系。或者认为实际上有很多依赖关系,因此我不会被迫找出其中的确切依赖关系树)。
无论如何,我都将ProjectA和ProjectB作为git子模块添加到中ProjectC。因此,它具有以下结构,
ProjectC
CMakeLists.txtlibc.cppProjectA (git子模块)
CMakeLists.txtliba.cppProjectB (git子模块)
CMakeLists.txtlibb.cppProjectA(子模块的git子模块ProjectB)
CMakeLists.txtliba.cpp并且具有以下内容CMakeLists.txt。
cmake_minimum_required(VERSION …Run Code Online (Sandbox Code Playgroud)