CMake项目共享依赖项

Shd*_*dNx 5 cmake

我有:

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

它们都有自己的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错误:二进制目录

.../libX/build
Run Code Online (Sandbox Code Playgroud)

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

.../libX
Run Code Online (Sandbox Code Playgroud)

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

我还尝试尝试创建本地构建目录,例如,将存在libY / build / deps-libX /,其中包含已配置和构建的库X(从Y使用时),而Z具有X和Y的库。 ,接下来我遇到了:

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

不能使用ExternalProject。

Gom*_*bat 6

其他答案:

我由于合并“错误”而收到此错误。在较大的项目中,合并后,在同一子目录上两次进行了一次名为“ add_subdirectory”的CMakeLists.txt。它会导致相同的错误消息。


Pet*_*ter 2

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)

  • 是的,但理想情况下我不希望 Z 必须知道 Y 依赖于 X。Z 唯一关心的应该是他同时使用 X 和 Y。有没有任何可靠的方法可以做到这一点? (5认同)