首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake项目共享依赖关系

CMake项目共享依赖关系
EN

Stack Overflow用户
提问于 2014-07-14 14:52:31
回答 2查看 9K关注 0票数 6

我有:

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

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

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

我的做法是:

代码语言:javascript
复制
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/构建 已用于构建源目录。它不能用于构建源目录。 ./libX 指定唯一的二进制目录名。

我还尝试创建一个本地构建目录,因此,例如,将出现libY/ build /deps-libX/包含配置和构建的库X(当从Y中使用时),而Z对X和Y都具有此功能。不幸的是,接下来我会遇到:

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

使用ExternalProject不是一种选择。

EN

回答 2

Stack Overflow用户

发布于 2016-11-14 15:03:57

其他人的另一个答案是:

我得到这个错误是因为合并“错误”。在一个较大的项目中,合并后,在同一个子目录中有一个名为“CMakeLists.txt”的add_subdirectory两次。它会导致相同的错误消息。

票数 8
EN

Stack Overflow用户

发布于 2014-07-15 08:19:54

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

对于这种链接情况

代码语言:javascript
复制
Z-->Y--->X
 --------^

您不需要从add_subdirectory(X)的CmakeLists.txt中调用CmakeLists.txt。

代码语言:javascript
复制
Z/CmakeLists.txt
   add_subdirectory(Y ...)

Y/CmakeLists.txt
   add_subdirectory(X ...)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24739401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档