我想用 Visual Studio 2010/VC10 和 CMake 创建一个库。
Windows 的树与 CMake 的项目树不同。问题是 CMake 不会在 Visual Studio 中创建带有头文件和源文件的 foolib。
我无法更改库的树,因为它是一个古老的代码,有很多共享多个包含文件的库。
root
|-'includes
| '-foo.h
|-'src
| '-libprojects
| | '-foolib
| | | '-bin
| | | '-project
| | | | '-mak100
| | | | '-CMakeLists01.txt
| | | '-src
| | | | '-CMakeLists02.txt
| | | | '-foo.cxx
CMakeLists.txt只有一个数字可以解释。
CMakeLists01.txt
cmake_minimum_required (VERSION 2.8)
cmake_policy (SET CMP0015 NEW)
project (foolib)
set (CMAKE_BUILD_TYPE Debug)
include_directories ("${PROJECT_SOURCE_DIR}/../../../../include")
# This dosen't works and CMake can't find the CMakeLists02.txt ???
add_subdirectory("${PROJECT_SOURCE_DIR}/../src")
CMakeLists02.txt
# CMakeLists02.txt
set (QueryHeader
"./../../../../include/foo.h")
set (QuerySources
"foo.cxx")
问题:如何使用 add_subdirectory() 将 CMakeLists02.txt 包含到 CMakeLists01.txt 中
如果有人测试,这是一个批处理文件
#doCMake.cmd
@echo off
call "c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tool\vsvars32.bat"
mkdir mak100
cd mak100
cmake -G "Visual Studio 10" ..
cd ..
pause
最佳答案
我刚刚试了一下你的例子,错误信息中给出了解决方案
CMake Error at CMakeLists.txt:10 (add_subdirectory):
add_subdirectory not given a binary directory but the given source
directory ".../src/libprojects/foolib/src"
is not a subdirectory of
".../src/libprojects/foolib/project". When
specifying an out-of-tree source a binary directory must be explicitly
specified.
正如@LPs 所指出的,请参阅 CMAKE add sub-directory which is not sub-directory on real directory 。只需将您的 add_subdirectory()
调用更改为类似以下内容:
add_subdirectory("../src" "src")
并且您不必在第一个参数前加上 ${PROJECT_SOURCE_DIR}
,在第二个参数前加上 ${CMAKE_CURRENT_BINARY_DIR}
(两者都是默认值,请参阅 add_subdirectory()
) .
我的建议是将 main/libraries CMakeLists01.txt
放入 foolib
文件夹中。那么您甚至不需要 CMakeLists02.txt
。
src/libprojects/foolib/CMakeLists.txt:
cmake_minimum_required (VERSION 2.8)
project (foolib CXX)
include_directories("../../../include")
add_library(foo "src/foo.cxx")
特别是在源文件和头文件位于单独的(子)文件夹中的情况下,执行类似 add_library(foo src/foo.cxx)
的操作完全可以/经常使用。
关于c++ - CMake 包含和源路径与 Windows 目录路径不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32903251/