CMake项目共享依赖项

时间:2014-07-14 14:52:31

标签: cmake

我有:

  • 共享库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错误...(add_subdirectory):二进制目录

.../libX/build
     

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

.../libX
     

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

我也尝试过创建一个本地构建目录,所以对于例如将有libY / build / deps-libX /包含已配置和构建的库X(当从Y使用时),并且Z具有X和Y两者。 不幸的是,接下来我碰到了:

  

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

使用ExternalProject不是一种选择。

3 个答案:

答案 0 :(得分:4)

其他人的补充答案:

由于合并"错误"我收到此错误。在一个更大的项目中,在合并之后,一个名为" add_subdirectory"的CMakeLists.txt;两次在同一个子目录中。它会导致相同的错误消息。

答案 1 :(得分:1)

X的CMakeLists.txt会被处理2次(add_subdirectory(X)Z都会调用Y。这会使目标X多次定义,这违反了政策CMP0002X不是全球唯一的)

对于此链接情况

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

您无需从add_subdirectory(X)的CmakeLists.txt致电Z

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

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

答案 2 :(得分:1)

这是一个非常古老的问题,但我将再次深入这个墓地,因为我最近再次遇到了这个问题。我的问题空间很像 OP:我有两个可执行文件,我想分别编译它们作为更大编译的一部分,它们都链接到同一个库,该库也通过 {{1 }}。由于这在不更改每个可执行文件的 cmake 的情况下是不可能的,因此以下答案非常有用:

https://stackoverflow.com/a/13290084

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

大师:

CMakeLists.txt

exec1 和 exec2:

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