Listing header files in Visual Studio C++ project generated by cmake
Asked Answered
M

5

65

I'm building a cmake based build system for our product. The problem is that Visual Studio project, generated by cmake, doesn't display header files in solution browser.

What I need to add in CMakeList.txt to list header files? The preferred solution is where no need to list each particular header file.

Solution Here is a solution I came with:

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

Thanks

Monumentalize answered 22/7, 2009 at 18:13 Comment(1)
As a bonus you can do source_group(headers FILES ${INCS}) To display them in a separate VS folderTamboura
H
46

Just add the header files along with the source files:

PROJECT (Test)

ADD_EXECUTABLE(Test test.cpp test.h)

Or using variables:

PROJECT (Test)

SET(SOURCE
  test.cpp
)

SET(HEADERS
  test.h
)

ADD_EXECUTABLE(Test ${SOURCE} ${HEADERS})
Hatchel answered 23/7, 2009 at 9:8 Comment(3)
IMO the thing all of these answers miss (with the exception of @Simeon) is that you don't want to explicitly list all of the header files, because: 1. The headers listed as explicit dependencies can easily drift out of sync with those you are actually using in the source, and 2. CMake knows already which headers you use, so it's redundant to input them manually as well. So we really need an answer that takes CMakes own knowledge of the header dependencies, and sticks them into a group for the solution.Rooseveltroost
I appreciate that the dependency scanner feature may only work for some languages... but it does work for C++, and it would be great to have this knowledge CMake already possesses available to users of Visual Studio. If not that, at least have some sort of hook so we can write it ourselves in CMake code (via source_group). An explicit list of dependencies will definitely go stale over time, as the compile will keep working even if it's wrong. Plus, it's redundant...Rooseveltroost
Works for me after combining with source_group("My Headers" FILES ${MY_HDRS})Abamp
D
28

The basic trick to this is to add the header files to one of the targets (either executable or library). This is particularly irritating because cmake already knows all the header file dependencies and should take care of this for us. You can organize it further using the source_group command:

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

Note that you have to do the same thing in Xcode too.

Dingdong answered 14/4, 2010 at 15:57 Comment(0)
D
9

I had the same problem while working at a build system for a Qt project and I came out with this solution, thanks to the other posts on this page. I included a complete example adapted from my makefiles. Hope this helps!

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)
Demitria answered 30/4, 2011 at 18:6 Comment(1)
It is not good form to do globbing. #1027747. From the cmake documentation: We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.Chufa
E
3

I know this answer is really late to the game, but in more recent versions of visual studio you can change the view from "CMake Target Mode" to a "Folder View"

enter image description here

In this folder view you will be able to see all of your header files.

To be honest i'd take simply changing the view in Visual Studio over modifying CMake files with Windows specific hacks any day.

Emerald answered 21/4, 2019 at 2:28 Comment(4)
What version of VS has this because I'm using VS 2017 Pro and there is no CMake Target View thingy? :/Jeane
@Daniel, I have been using VS 2019, I would suggest updating because the CMake support has improved a lot in the latest version.Emerald
Note that this doesn't work with out-of-source builds.Kanishakanji
@AlexanderRevo that isn't necessarily true. We have a project at work that does an out of source build that lets you view CMake targets in Visual studio like this. The configuration for the project is ridiculously complex though so I'm not sure how they got it to work.Emerald
T
0

In my CMake setup, I use file(GLOB ...) to collect all files in a directory. Then, I loop through each file, including it with include(${FILE}). This method dynamically integrates all files into the build process.

#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()
Terr answered 2/3 at 6:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.