如何将CMake的头文件和库添加到Visual Studio解决方案?

11

我使用CMake生成Visual Studio 2010的项目和解决方案文件。实际上,我可以从CMake设置不同的设置,如警告级别、增量构建标志等。但是我无法设置在VC++目录配置选项卡中列出的其他包含文件和库。实际上,我必须手动设置这些目录。这很愚蠢和乏味...

我尝试设置以下CMake变量:CMAKE_INCLUDE_PATH、INCLUDE_DIRECTORY,但没有任何效果。如果我打开项目,解决方案的额外包含目录始终为空(仅提供标准MSVE设置)。

我还尝试在可执行文件创建后设置这些变量,但这也没有效果。

这是我直接在cmake文件头中执行的操作:

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(${MODULE_NAME})
IF (MSVC)
   # Activate C++ exception handling
   IF (NOT CMAKE_CXX_FLAGS MATCHES "/EHsc")
   SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") 
   ENDIF ()

   # Set Warning level always to 4
   IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
     string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
   ELSE ()
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
   ENDIF ()

   #read path of dependency modules  
   file(READ "msvc.deps" MSVC_PROPERTIES)
   STRING(REGEX REPLACE ";" "\\\\;" MSVC_PROPERTIES "${MSVC_PROPERTIES}")
   STRING(REGEX REPLACE "\n" ";" MSVC_PROPERTIES "${MSVC_PROPERTIES}")

   FOREACH(e ${MSVC_PROPERTIES})
     SET(INCLUDE ${INCLUDE} ${e})
     MESSAGE(STATUS "[INFO]: Value ${e}")
   ENDFOREACH(e)
   INCLUDE_DIRECTORIES(${INCLUDE})
ENDIF ()

在我的.deps文件中,我已经添加了依赖模块的路径,每行分开:

c:\binrev\development\boost\1.47\includes
c:\binrev\repository\modules\brCore\trunk\includes

两者都成功读取,但无法在我的MSVC解决方案中设置为额外的包含目录。

最好的问候, Hellhound

3个回答

10

我还尝试使用SET(ENV${PATH} "c:\test...")设置MSVC环境变量INCLUDE和PATH,但这也没有效果。MSVC解决方案的目录为空。 - Hellhound
即使在您的CMakeLists.txt文件中添加了include_directories(/path/to/include),它们仍然没有设置吗?您是在声明目标之前添加include_directories吗?(顺序很重要)。如果是这样,您可以发布部分或全部包含问题的CMakeLists.txt文件吗?请注意,CMAKE_INCLUDE_PATH变量与编译器使用的包含路径无关,并且没有名为INCLUDE_DIRECTORY的变量或命令。 - Adam Bowen
在调用include_directories(/path/to/include)之后,MSVC解决方案的附加包含目录中没有设置任何内容。是的,在声明目标之前,包含目录已经被设置在顶部。 - Hellhound
我设法抽出5分钟时间来检查您发布的代码。如果我在配置文件末尾添加add_executable(test test.cpp)并生成一个VS2010项目(这是我们拥有的版本),然后右键单击“test”项目,选择属性,然后转到C/C++-->常规,那么包含目录将列在“附加包含目录”属性下。如果您的项目不是这种情况,则必须在您发布的代码之外存在某些问题。 - Adam Bowen
我建议创建一个最小的CMakeLists.txt文件,看看需要多少最少的代码才能重现问题。我应该注意到我们使用(并要求)CMake 2.8。 - Adam Bowen
显示剩余5条评论

2
我相信在CMakeLists.txt中的include_directories("path")会将path添加到C++包含路径中。

1
这些变量已经设置,但是没有任何反应。在解决方案中,包含目录为空。我也尝试在可执行文件生成后设置此变量,但没有效果。 - Hellhound

1
是的。虽然它在“VC++目录”选项卡下的“包含目录”中不可见,但在C/C++ -> 通用 中的“附加包含目录”中可见。

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