我有:
它们都有自己的CMakeLists.txt,可以独立配置和构建。
但是,我无法使CMakeLists.txt为可执行文件(Z)工作。
我的做法是:
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不是一种选择。
发布于 2016-11-14 15:03:57
其他人的另一个答案是:
我得到这个错误是因为合并“错误”。在一个较大的项目中,合并后,在同一个子目录中有一个名为“CMakeLists.txt”的add_subdirectory两次。它会导致相同的错误消息。
发布于 2014-07-15 08:19:54
X的CMakeLists.txt被处理了2次(add_subdirectory(X)同时从Z和Y调用)。这使得目标X被定义了多次,这违反了策略CMP0002 (X并不是全局唯一的)。
对于这种链接情况
Z-->Y--->X
--------^您不需要从add_subdirectory(X)的CmakeLists.txt中调用CmakeLists.txt。
Z/CmakeLists.txt
add_subdirectory(Y ...)
Y/CmakeLists.txt
add_subdirectory(X ...)https://stackoverflow.com/questions/24739401
复制相似问题