【问题标题】:CMake project shared dependenciesCMake 项目共享依赖项
【发布时间】:2014-07-14 14:52:31
【问题描述】:

我有:

  • 一个共享库 X,它是独立的
  • 共享库 Y,使用 X
  • 一个可执行的 Z,它同时使用 X 和 Y

它们都有自己的CMakeLists.txt,可以独立配置和构建。

但是,我无法使可执行文件 (Z) 的 CMakeLists.txt 正常工作。

我的方法是这样的:

foreach(clib ${OWN_LIBS})
   set(LIBS "${LIBS} ${clib}")
   set(CLIB_DIR "${PROJECT_SOURCE_DIR}/../lib${clib}")
   set(CLIB_BUILD_DIR "${CLIB_DIR}/build")

   add_subdirectory("${CLIB_DIR}" "${CLIB_BUILD_DIR}")
   include_directories("${CLIB_DIR}/incl")
   link_directories("${CLIB_BUILD_DIR}")
endforeach(clib)

OWN_LIBS 在项目 Y 中只是“X”,在项目 Z 中是“X Y”。

这适用于项目 Y,但在项目 Z 中,我得到:

CMake Error at ... (add_subdirectory): 二进制目录

.../libX/build

已用于构建源目录。它不能用于 构建源码目录

.../libX

指定一个唯一的二进制目录名。

我也尝试创建一个本地构建目录,例如会有 libY/build/deps-libX/ 包含配置和构建的库 X(当从 Y 使用时),并且 Z 对 X 和 Y 都有这个。 不幸的是,接下来我遇到了:

add_library 无法创建目标“X”,因为另一个目标 同名已经存在。现有目标是共享的 在源目录中创建的库 “libX”。看 有关详细信息,请参阅政策 CMP0002 的文档。

使用 ExternalProject 不是一种选择。

【问题讨论】:

标签: cmake


【解决方案1】:

其他人的附加答案:

由于合并“错误”,我收到此错误。在一个较大的项目中,合并后,一个名为“add_subdirectory”的 CMakeLists.txt 在同一个子目录中出现了两次。它会导致相同的错误消息。

【讨论】:

    【解决方案2】:

    X 的 CMakeLists.txt 被处理了 2 次(add_subdirectory(X)ZY 调用)。这使得目标X 定义了多次,这违反了CMP0002 策略(X 不是全局唯一的)

    对于这种链接情况

    Z-->Y--->X
     --------^
    

    你不需要从Z的CmakeLists.txt调用add_subdirectory(X)

    Z/CmakeLists.txt
       add_subdirectory(Y ...)
    
    Y/CmakeLists.txt
       add_subdirectory(X ...)
    

    【讨论】:

    • 对,但理想情况下我不希望 Z 必须知道 Y 依赖于 X。Z 唯一关心的应该是他同时使用 X 和 Y。有什么可靠的方法吗?
    • XY 可以在 package
    【解决方案3】:

    这是一个非常古老的问题,但我要深入挖掘这个墓地,因为我最近又遇到了这个问题。我的问题空间很像 OP:我有两个可执行文件,我想单独编译 作为更大编译的一部分,它们都链接到同一个库,该库也通过 cmake 编译.如果不更改每个可执行文件的CMakeList.txt,这根本不可能,因此以下答案证明非常有帮助:

    https://stackoverflow.com/a/13290084

    如果项目是使用“主”CmakeList.txt 编译的,则链接库不会添加到每个可执行文件中。如果编译了单个可执行文件,则构建并链接库。请注意,这会在每个 CMakeLists.txt 中生成以下内容:

    大师:

    add_subdirectory( common )
    add_subdirectory( exec1  )
    add_subdirectory( exec2  )
    

    exec1 和 exec2:

    set( COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../common )
    
    if ( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )
        add_subdirectory( ${COMMON_DIR} ${COMMON_DIR})
    endif()
    

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      相关资源
      最近更新 更多