CMake使用C样式的预编译头,而不是预编译头的C++版本



我的项目目录如下:

<PROJECT-ROOT>:
- build
- MyProject:
- src:
- main.cpp
- hello.h (basic file that contains a simple function that prints something using iostream)
- pch.h (precompiled header)
- CMakeLists.txt

CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 3.16)
project(MyProject)
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic -std=c++11")
endif()
include_directories(
MyProject
MyProject/src
)

add_executable(${PROJECT_NAME} ${CMAKE_SOURCE_DIR}/MyProject/pch.h 
${CMAKE_SOURCE_DIR}/MyProject/src/main.cpp
${CMAKE_SOURCE_DIR}/MyProject/src/hello.h)
target_precompile_headers(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/MyProject/pch.h)

正如预期的那样,CMake在build/CMakeFiles/MyProject.dir/中生成以下预编译的头文件:

cmake_pch.c
cmake_pch.cxx
cmake_pch.cxx.obj
cmake_pch_cxx.pch
cmake_pch.h
cmake_pch.hxx

我在Visual Studio 2019中使用这个CMake项目,当我尝试运行main.cpp时,Visual Studio会给我一堆错误,例如:

C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includecstdlib(23): error C2061: syntax error: identifier 'noexcept'
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includecstdlib(23): error C2059: syntax error: ';'
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includecstdlib(23): error C2449: found '{' at file scope (missing function header?)
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includecstdlib(25): error C2059: syntax error: '}'
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includecstdlib(31): error C2061: syntax error: identifier 'noexcept'
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includecstdlib(31): error C2059: syntax error: ';'
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includecstdlib(31): error C2449: found '{' at file scope (missing function header?)
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includecstdlib(33): error C2059: syntax error: '}'
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includextr1common(19): error C2061: syntax error: identifier 'std'
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includextr1common(19): error C2059: syntax error: ';'
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includextr1common(19): error C2449: found '{' at file scope (missing function header?)
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includextr1common(235): error C2059: syntax error: '}'
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includeiosfwd(175): warning C4157: pragma was ignored by C compiler
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includeiosfwd(180): warning C4157: pragma was ignored by C compiler
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includetype_traits(307): error C4233: nonstandard extension used: '__is_union' keyword only supported in C++, not C
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includetype_traits(310): error C4233: nonstandard extension used: '__is_union' keyword only supported in C++, not C
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includetype_traits(313): error C4233: nonstandard extension used: '__is_class' keyword only supported in C++, not C
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includetype_traits(316): error C4233: nonstandard extension used: '__is_class' keyword only supported in C++, not C
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includetype_traits(325): error C4233: nonstandard extension used: '__is_convertible_to' keyword only supported in C++, not C
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includetype_traits(330): error C4233: nonstandard extension used: '__is_convertible_to' keyword only supported in C++, not C
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includetype_traits(359): error C4233: nonstandard extension used: '__is_enum' keyword only supported in C++, not C
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includetype_traits(362): error C4233: nonstandard extension used: '__is_enum' keyword only supported in C++, not C
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includetype_traits(499): error C4233: nonstandard extension used: '__is_pod' keyword only supported in C++, not C

当我在网上搜索错误代码C4233时,我了解到这是因为C代码正试图编译为C++代码。此外,Visual Studio的构建过程(我猜使用了忍者(显示:

[1/33] Building C object CMakeFilesMyProject.dircmake_pch.c.obj

因此,我猜它试图将我的预编译头构建为c源代码,而不是c++源代码。我还尝试将pch扩展名更改为.hpp,但也没有成功。如何指定CMake将预编译头标记为C++(或者我猜是CXX(源代码,而不是纯C?

EDIT:当我禁用target_precompile_headers时,程序运行良好,因此我确信这是一个预编译的头问题。

多亏了@drescherjm,添加target_precompile_headers(${PROJECT_NAME} PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_SOURCE_DIR}/MyProject/pch.h>"消除了错误。

最新更新