Gcc 如何将全局文件扩展名(*.pde)添加到被视为C++;代码

Gcc 如何将全局文件扩展名(*.pde)添加到被视为C++;代码,gcc,cmake,Gcc,Cmake,我有一个非常简单的CMake脚本。不幸的是,项目使用了一个*.PDE文件,它是普通C++或C代码。 CMake正在处理任何文件结尾,但我得到了一个编译器错误,因为GCC不知道如何处理它。如何将全局文件扩展名添加到GCC,以便将*.pde文件编译为通常的*.cpp文件 > -x C++ +fo.PDE < /C>命令,如果我想使用控制台,那是很好的,但是对于CMake,我认为它不适用。 cmake_minimum_required(VERSION 2.8) project(RPiCopter)

我有一个非常简单的CMake脚本。不幸的是,项目使用了一个*.PDE文件,它是普通C++或C代码。 CMake正在处理任何文件结尾,但我得到了一个编译器错误,因为GCC不知道如何处理它。如何将全局文件扩展名添加到GCC,以便将*.pde文件编译为通常的*.cpp文件

<> > <代码> -x C++ +fo.PDE < /C>命令,如果我想使用控制台,那是很好的,但是对于CMake,我认为它不适用。
cmake_minimum_required(VERSION 2.8)
project(RPiCopter)

SET( RPiCopter
  absdevice
  containers
  device
  exceptions
  navigation
  frame
  vehicle
  receiver
  scheduler
  tinycopter.pde
)

message( STATUS "Include ArduPilot library directories" )
foreach( DIR ${AP_List} ${AP_List_Linux} ${AP_Headers} )
  include_directories( "../libraries/${DIR}" )
endforeach()
include_directories( zserge-jsmn )

# ***************************************
# Build the firmware
# ***************************************
add_subdirectory ( zserge-jsmn )

#set(CMAKE_CXX_FLAGS "-x c++ *.pde")
ADD_EXECUTABLE ( RPiCopter ${RPiCopter} )
target_link_libraries ( RPiCopter -Wl,--start-group ${AP_List} ${AP_List_Linux} jsmn -Wl,--end-group )

您应该能够使用属性来将文件标记为C++源:

设置源文件属性(${TheFiles}属性语言CXX)
正如@steveire在他自己的回答中指出的那样,将需要以下解决方法:

设置源文件属性(${TheFiles}属性语言CXX)
如果(CMAKE\U CXX\U编译器\U ID STREQUAL“GNU”)
添加_定义(“-xC++”)
endif()

CMake不会为您这样做:


我决定使用这种方法。我只是删除临时构建目录中以cmake结尾的文件。 因此,GCC不再因为奇怪的Arduino*.pde文件扩展名而感到困惑

# Exchange the file ending of the Arduino project file
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tinycopter.pde ${CMAKE_CURRENT_BINARY_DIR}/tinycopter.cpp)

通常,您应该能够扩展
CMAKE\u CXX\u源文件\u扩展名
。如果您有很多文件扩展名未知,这会有所帮助

但此变量未缓存-例如
CMAKE\u CXX\u FLAGS
是-因此中的以下代码将始终覆盖/隐藏您将设置的内容:

set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC)
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP)

我认为这是非缓存,但直到这将被改变,我搜索了一个解决方案,考虑如下:

  • 通常情况下,您不希望更改CMake安装中的文件
  • 如果在
    project()
    /
    enable\u language()
    之后更改
    CMAKE\u CXX\u源文件扩展名
    ,则不会产生任何效果(如前所述)
我已经使用
cmakecxcompiler.cmake.in中的一个“hook”/configuration变量成功地测试了以下内容:

cmake_minimum_required(VERSION 2.8)

set(CMAKE_CXX_SYSROOT_FLAG_CODE "list(APPEND CMAKE_CXX_SOURCE_FILE_EXTENSIONS pde)")

project(RPiCopter CXX)

message("CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${CMAKE_CXX_SOURCE_FILE_EXTENSIONS}")

add_executable(RPiCopter tinycopter.pde)

我在我的答案中添加了更多的信息,这似乎回避了这个问题。我怀疑这是真的,但并不能解决问题。如果能为所有不同的编译器和文件扩展名提供类似于包装器的东西,那就太好了。我现在使用configure_文件。这不是优雅而是有效的,这是真的。如果不能解决问题,那没关系。这正是正确的答案。
set\u source\u file\u properties()
调用是正确的方法,但是我会将全局
add\u definitions()
调用替换为
set\u source\u properties(${TheFiles}properties COMPILE\u FLAGS“-xc++”)
,以将定义限制为那些files@jairo我同意<如果像
project(casm C ASM\u NASM)
那样构建多语言项目,那么code>add\u定义就不能很好地工作。