我有:
它们都有自己的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)
Run Code Online (Sandbox Code Playgroud)
OWN_LIBS在项目Y中只是“ X”,而在项目Z中是“ X Y”。
这适用于项目Y,但在项目Z中,我得到:
...(add_subdirectory)处的CMake错误:二进制目录
Run Code Online (Sandbox Code Playgroud).../libX/build已经用于构建源目录。它不能用于构建源目录
Run Code Online (Sandbox Code Playgroud).../libX指定唯一的二进制目录名称。
我还尝试尝试创建本地构建目录,例如,将存在libY / build / deps-libX /,其中包含已配置和构建的库X(从Y使用时),而Z具有X和Y的库。 ,接下来我遇到了:
add_library无法创建目标“ X”,因为已经存在另一个具有相同名称的目标。现有目标是在源目录“ libX”中创建的共享库。有关更多详细信息,请参阅策略CMP0002的文档。
不能使用ExternalProject。
其他答案:
我由于合并“错误”而收到此错误。在较大的项目中,合并后,在同一子目录上两次进行了一次名为“ add_subdirectory”的CMakeLists.txt。它会导致相同的错误消息。
X的 CMakeLists.txt 被处理两次(从和add_subdirectory(X)调用)。这使得目标被多次定义,这违反了策略(不是全局唯一的)ZYXCMP0002X
对于这种链接情况
Z-->Y--->X
--------^
Run Code Online (Sandbox Code Playgroud)
您不需要add_subdirectory(X)从Z的 CmakeLists.txt调用
Z/CmakeLists.txt
add_subdirectory(Y ...)
Y/CmakeLists.txt
add_subdirectory(X ...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5257 次 |
| 最近记录: |