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

标签 c++ c cmake

我想用 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/

相关文章:

c++ - 运算符重载的基本规则和惯用法是什么?

c - WinAPI 多线程应用程序

c++ - CMake:隐藏 -WShadow 子目标的全局编译标志

c++ - "Hello world!"在 C++ 中卡住

c++ - 条件宏或扩展模板

c++ - 保持 std::mutex 锁定/解锁公开的基本原理

c - 错误: Invalid use of flexible array member

c - 为什么我在Rust中的C strlen()也计算print中的字符串切片! `s`变量后的宏?

c++ - 如何从 Visual Studio 远程构建 32 位 linux 模块?

c++ - 是否可以使用 CMake 构建 Boost?