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

4
我希望使用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

我不明白你的问题,因此如果你发布了一个问题,我就无法理解。你介意多解释一点你期望得到什么以及实际得到了什么吗? - usr1234567
1
可能是CMAKE添加非实际目录的子目录的重复问题。 - LPs
@ago。你走对了! - post4dirk
@usr1234567:问题是我应该在CMakeLists01.txt的“add_subdirectory”行中写什么来包含CMakeList02。 - post4dirk
请参阅CMake包含和源路径-基本设置。为什么不将主要/库的CMakeLists01.txt放入foolib文件夹中?然后我认为您甚至不需要CMakeLists02.txt。执行类似于add_library(foo src/foo.cxx)的操作是完全可以的。 - Florian
1个回答

2
我刚才试了一下您的示例,解决方案已经在错误消息中给出。
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())。建议将主/库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) 这样的方式完全可以/经常被使用。


非常感谢。您的解决方案只使用一个CMakeLists.txt非常好。在我的情况下,我必须隐藏项目文件夹中的CMakeLists.txt文件,但这不会成为问题。在20个或更多C文件的情况下,我将采用2个CMakeLists.txt的解决方案,因为它更加清晰易懂。 - post4dirk
@user3355421 您好。关于源文件的清晰度,您可能也会对CMake中保持子目录间文件层次结构的方法感兴趣。 - Florian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接