CMake包含路径和源路径与Windows目录路径不同

CMake include and source paths are not the same as the Windows Directory paths

本文关键字:路径 Windows 包含 CMake      更新时间:2023-10-16

我想用Visual Studio 2010/VC10和CMake创建一个库。

Windows的树与CMake项目树不同。问题是CMake不会在Visual Studio中创建头文件和源文件。

我不能改变库的树,因为它是一个老的代码,很多库共享几个包含文件。

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.0Common7Toolvsvars32.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_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)之类的操作完全可以/经常使用。