我有:
所有这些都有自己的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不是一种选择。
答案 0 :(得分:4)
其他人的补充答案:
由于合并"错误"我收到此错误。在一个更大的项目中,在合并之后,一个名为" add_subdirectory"的CMakeLists.txt;两次在同一个子目录中。它会导致相同的错误消息。
答案 1 :(得分:1)
X
的CMakeLists.txt会被处理2次(add_subdirectory(X)
和Z
都会调用Y
。这会使目标X
多次定义,这违反了政策CMP0002
(X
不是全球唯一的)
对于此链接情况
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 )