假设有以下目录结构:
projects
|
+--lib1
| |
| +-CMakeFiles.txt
|
+--lib2
| |
| +-CMakeFiles.txt
|
+--test
|
+-CMakeFiles.txt
lib1/CMakeFiles.txt:
cmake_minimum_required(VERSION 2.0)
add_library(lib1 STATIC lib1.cpp)
lib2/CMakeFiles.txt:
cmake_minimum_required(VERSION 2.0)
add_subdirectory(../lib1 ${CMAKE_CURRENT_BINARY_DIR}/lib1)
add_library(lib2 STATIC lib2.cpp)
target_link_libraries(lib2 lib1)
测试/CMakeFiles.txt:
cmake_minimum_required(VERSION 2.0)
project(test)
add_subdirectory(../lib1 ${CMAKE_CURRENT_BINARY_DIR}/lib1)
add_subdirectory(../lib2 ${CMAKE_CURRENT_BINARY_DIR}/lib2)
add_executable(test main.cpp)
target_link_libraries(test lib1 lib2)
即lib2
取决于lib1
并且test
取决于它们两者。(我知道技术上的静态库不会“链接”,但这只是一个例子。)
问题在于,在当前设置下,lib1 编译了两次——第一次在“test”构建目录中,第二次在“test/build_directory/lib2/build_directory”中。我想避免这种情况。
我希望能够将对 lib1、lib2 或两者(使用 add_subdirectory)的依赖项添加到位于其他地方的任何项目中。所以移动 CMakeFiles 不是一种选择。我还想避免多次编译任何库。
我怎样才能做到这一点?
平台:CMake v. 2.8.4 和 Windows XP SP3
顶级 CMakeLists.txt 文件不是一个选项,因为我想保持一个干净的顶级目录,并能够在其他项目中包含可以位于其他地方的库。因为它是 Windows,所以我不能“在系统范围内安装包”——我不想失去即时切换编译器的能力。使用不同编译器构建的实用程序库将使用不同的 C 运行时库/ABI,因此将不兼容。