将C和C++与CMAKE混合使用

Car*_*s00 21 c c++ gcc g++ cmake

我们主要编写一个应用程序,C但有些子模块是用C++(在Linux上)编写的.问题是如何编写用于某些子目录和另一个子目录的CMakeLists.txt文件.g++gcc

Bor*_*ort 21

如果没有另外设置,编译器和链接器通常由文件扩展名确定.因此,只要文件结尾很好,您的代码就会被编译并与正确的编译器链接.

另外,如果混合使用C和C++,请记住制作正确的extern C声明.

  • "如果没有另外设置",即在`CMakeLists.txt`的顶部,使用`project(myproject)`而不是'project(myproject C)`. (7认同)
  • 或者通过说“project(myproject LANGUAGES C CXX)”来完整拼写它。当您自己未指定任何语言时,启用 C 和 CXX 是默认的 CMake 行为。https://cmake.org/cmake/help/latest/command/project.html (3认同)

Dea*_*n P 12

CMake 应利用文件扩展名指定的相关编译器和链接器。在使用 C 和 C++ 组合编译并链接到可执行文件的实例中,您会说:

add_executable(MyEXE main.cpp myFile.c)
Run Code Online (Sandbox Code Playgroud)

我想补充一个令人痛苦的琐碎的观点。

在这种情况下,您必须确保您的项目具有正确的语言名称参数,即 1

project(MyProject C CXX)
Run Code Online (Sandbox Code Playgroud)

这应该在添加 CMake 文件时自动完成,但根据添加文件的顺序,参数可能仅包含 C 或 CXX。

例如,如果您仅将 C 作为语言参数,并且您的参数int main()位于 main.cpp 中,则您的程序入口点将不存在,并且编译器将忽略错误。


1或者,您可以省略语言参数,在这种情况下,将选择 C ​​和 CXX 的默认参数。看这里


Ran*_*ook 10

CMake自动执行此操作.您可以在CMakeLists.txt文件中自由混合使用这两种类型的文件:

. . .
add_executable(
    my_program
    code.cpp
    more_code.c
)
Run Code Online (Sandbox Code Playgroud)

我一直这样做,它只是有效.

  • 请注意,您需要C-header保护.所以在code.cpp中你会说`extern'C"{#include"more_code.h"}` (4认同)

arr*_*owd 5

您可以将源文件的LANGUAGE属性设置为“ CXX”。请参阅文档