【问题标题】:Can CMake use g++ to compile C files?CMake 可以使用 g++ 编译 C 文件吗?
【发布时间】:2011-12-03 04:44:48
【问题描述】:

我曾在一个项目中使用 g++ 编译以 .c 结尾的文件中的 C 代码。原因是我被告知 g++ 有更好的警告信息。

我正在将此项目的构建过程切换为使用 CMake。我发现最初 CMake 想使用 gcc 来编译 C 文件。由于在使用时声明变量之类的事情,这失败了。所以我尝试使用g++通过设置编译C文件

set(CMAKE_C_COMPILER_INIT g++)

在 CMakeLists.txt 文件中。但这会导致错误消息:

#error "The CMAKE_C_COMPILER is set to a C++ compiler"

我一直在将我的 .c 文件重命名为 .cpp 以解决此问题,因为这似乎是让事情正常进行的最简单方法,也许也是最好的方法。但我想知道是否可以强制 CMake 使用 g++ 编译 C 文件。

【问题讨论】:

  • “原因是我被告知 g++ 有更好的警告信息。” - 你能确认一下吗?我想说这是非常值得怀疑的,因为(据我所知)两者都只是使用不同参数(语言、包含路径、链接的标准库等)调用相同编译器的驱动程序。除此之外,g++ 不是C 编译器,所以你最终会写出非常糟糕的 C++。
  • 如果您正在编写 C,则使用 C 编译器进行编译。 C 和 C++ 不是一回事。
  • 你说'因为在使用时声明变量之类的事情而失败';听起来您在 C89 模式下使用 GCC,而不是 C99 模式。尝试将 -std=c99 添加到 C 编译器 - 不知何故。
  • 感谢 cmets 我一定会考虑这些建议。

标签: gcc g++ cmake


【解决方案1】:

您不应为此目的覆盖编译器。如果你真的需要将你的 C 文件编译为 C++,那么你应该教 cmake 你的文件属于 C++ 语言:

set_source_files_properties(filename.c PROPERTIES LANGUAGE CXX )

【讨论】:

  • 听起来我想做的不是最好的主意,我应该将文件重命名为 .cpp。但是感谢您提供正确的答案,如果确实有必要,知道如何做我想做的事情很有用。
  • 知道为什么将它应用到我项目中的单个文件会使项目中的所有文件都编译为 C++ 吗?我有一堆 .c 文件,我只想将其中一个编译为 C++。
  • @Scorpio,我实际上想要那种症状,但是以一种定义的方式......为什么 CMake 没有办法将所有 .c 文件编译为 C++?
  • 您可以执行以下操作来处理所有 C 文件和 C++。 file(GLOB_RECURSE CFILES "${CMAKE_SOURCE_DIR}/*.c") SET_SOURCE_FILES_PROPERTIES(${CFILES} PROPERTIES LANGUAGE CXX )
  • Clang 打印出 deprecated 消息:clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
【解决方案2】:

如果需要切换整个项目,请在project指令中设置:

project(derproject LANGUAGES CXX)

【讨论】:

  • 这会破坏一些正在使用的功能测试。
【解决方案3】:

要让 cmake 将所有 C 文件视为 C++ 文件,请使用:

file(GLOB_RECURSE CFILES "${CMAKE_SOURCE_DIR}/*.c")
SET_SOURCE_FILES_PROPERTIES(${CFILES} PROPERTIES LANGUAGE CXX )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 2020-02-05
    • 1970-01-01
    • 2021-08-19
    • 2021-11-23
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多