相关疑难解决方法(0)

CMake:使用相同静态库的多个子项目

我正在使用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?

谢谢你的帮助,

static cmake

21
推荐指数
2
解决办法
1万
查看次数

如何作为嵌套子模块提供时,如何处理同一个库的多个版本

我有一个依赖于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的组合,因为它简单而干净,但嵌套的依赖项很棘手.

c++ cmake git-submodules

6
推荐指数
0
解决办法
437
查看次数

CMake并使用git-submodule进行依赖项目

考虑以下三个项目。

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.txt
    • libb.cpp
    • ProjectA (git子模块)
      • CMakeLists.txt
      • liba.cpp

ProjectBCMakeLists.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。它取决于ProjectAProjectB。并假设我不知道该ProjectB依赖关系ProjectA已经存在(例如,我之前没有创建过这两个ProjectC依赖关系。或者认为实际上有很多依赖关系,因此我不会被迫找出其中的确切依赖关系树)。

无论如何,我都将ProjectAProjectB作为git子模块添加到中ProjectC。因此,它具有以下结构,

  • ProjectC
    • CMakeLists.txt
    • libc.cpp
    • ProjectA (git子模块)
      • CMakeLists.txt
      • liba.cpp
    • ProjectB (git子模块)
      • CMakeLists.txt
      • libb.cpp
      • ProjectA(子模块的git子模块ProjectB
        • CMakeLists.txt
        • liba.cpp

并且具有以下内容CMakeLists.txt

cmake_minimum_required(VERSION …
Run Code Online (Sandbox Code Playgroud)

cmake git-submodules

3
推荐指数
1
解决办法
3687
查看次数

标签 统计

cmake ×3

git-submodules ×2

c++ ×1

static ×1