2014-07-14 125 views
2

我有:CMake的项目共享依赖

  • 共享库X,它是独立
  • 共享库Y,使用X
  • 可执行Z,其使用X和Y

它们都有自己的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是项目Ÿ只是 “X”,并在项目Z.是 “XY”

这适用于工程Y,但在项目Z,我得到:

CMake的错误在...(add_subdirectory):二进制目录

.../libX/build 

已用于构建源目录。它不能被用来 编译源代码目录

.../libX 

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

我也尝试创建一个本地生成目录,所以例如,将有立白/建造/ DEPS-了libx /包含配置和内置库X(选自Y当使用时),和具有该两个X Z和Y. 不幸的是,下一个I跑进:

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

使用ExternalProject不是一个选项。

+0

我最终最终使用了http://stackoverflow.com/a/11217008/128240上的解决方案。 – ShdNx

+0

[CMake - 在同一个项目中的应用程序/库之间的依赖关系(头文件)]的可能重复(http://stackoverflow.com/questions/11216408/cmake-dependencies-headers-between-apps-libraries-in-same-project) – ShdNx

回答

0

X的CMakeLists.txt处理2次(从ZY都调用add_subdirectory(X))。这使得目标X定义多次,违反政策CMP0002X不是全球唯一的)

该链接的情况

Z-->Y--->X 
--------^ 

你不需要调用add_subdirectory(X)Z的CmakeLists。TXT

Z/CmakeLists.txt 
    add_subdirectory(Y ...) 

Y/CmakeLists.txt 
    add_subdirectory(X ...) 
+3

对,但理想情况下,我不想让Z必须知道Y取决于X. Z唯一的担心应该是他同时使用X和Y.有没有强大的方法来做到这一点? – ShdNx

+0

“X”和“Y”可以在[包](http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries) – Peter

0

别人的附加应答:

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