列出cmake生成的Visual Studio C++项目中的头文件

问题描述 投票:0回答:5

我正在为我们的产品构建一个基于 cmake 的构建系统。问题是由 cmake 生成的 Visual Studio 项目不会在解决方案浏览器中显示头文件。

我需要在 CMakeList.txt 中添加什么来列出头文件? 首选解决方案是不需要列出每个特定的头文件。

解决方案 这是我带来的解决方案:

file(GLOB_RECURSE INCS "*.h")
add_library(myLib ${SRCS} ${INCS})

谢谢

c++ visual-studio-2008 cmake
5个回答
46
投票

只需添加头文件和源文件:

PROJECT (Test)

ADD_EXECUTABLE(Test test.cpp test.h)

或者使用变量:

PROJECT (Test)

SET(SOURCE
  test.cpp
)

SET(HEADERS
  test.h
)

ADD_EXECUTABLE(Test ${SOURCE} ${HEADERS})

27
投票

基本技巧是将头文件添加到目标之一(可执行文件或库)。这特别令人恼火,因为 cmake 已经知道所有头文件依赖项,并且应该为我们处理这个问题。您可以使用 source_group 命令进一步组织它:

  source_group("My Headers" FILES ${MY_HDRS})

请注意,您也必须在 Xcode 中执行相同的操作。


9
投票

我在 Qt 项目的构建系统上工作时遇到了同样的问题,感谢本页面上的其他帖子,我提出了这个解决方案。我提供了一个改编自我的 makefile 的完整示例。希望这有帮助!

cmake_minimum_required (VERSION 2.6) 
project (DemoSolution)

find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})

include_directories (../../include/)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

file(GLOB Demo_SOURCES *.cpp)
file(GLOB Demo_HEADERS *.hpp)
file(GLOB Demo_FORMS *.ui)
file(GLOB Demo_RESOURCES resources.qrc)

qt4_wrap_cpp(Demo_MOC ${Demo_HEADERS})
qt4_wrap_ui(Demo_FORMS_HEADERS ${Demo_FORMS})
qt4_add_resources(Demo_RESOURCES_RCC ${Demo_RESOURCES})

source_group("Headers" FILES ${Demo_HEADERS})
source_group("MOC" FILES ${Demo_MOC})

set(QT_USE_QTNETWORK, true)
set(QT_USE_QTSQL, true)
set(QT_USE_QTXML, true)

add_library(Demo SHARED
    ${Demo_SOURCES}
    ${Demo_HEADERS}
    ${Demo_MOC}
    ${Demo_FORMS_HEADERS}
    ${Demo_RESOURCES_RCC}
    )

target_link_libraries(Demo ${QT_LIBRARIES})
add_definitions(-D_DEMO_EXPORTS)

2
投票

我知道这个答案确实太晚了,但在 Visual Studio 的最新版本中,您可以将视图从“CMake 目标模式”更改为“文件夹视图”

在此文件夹视图中,您将能够看到所有头文件。

说实话,我每天都会选择简单地更改 Visual Studio 中的视图,而不是使用 Windows 特定的 hack 修改 CMake 文件。


0
投票

在我的 CMake 设置中,我使用 file(GLOB ...) 收集目录中的所有文件。然后,我循环遍历每个文件,并将其包含在 include(${FILE}) 中。此方法将所有文件动态集成到构建过程中。

#Define a variable to store all files within the specified directory
file(GLOB MY_DIRECTORY_FILES "${PROJECT_SOURCE_DIR}/*")

#Iterate over each file in the directory
foreach(FILE ${MY_DIRECTORY_FILES})
    # Include each file found in the directory
    include(${FILE})
endforeach()
© www.soinside.com 2019 - 2024. All rights reserved.