使用CMAKE混合编写C和C++代码

37

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

5个回答

34

如果没有特别指定,编译器和链接器通常由文件扩展名决定。因此只要文件后缀正确,你的代码就会使用正确的编译器进行编译和链接。

顺便提一下,如果你混合使用C和C++,请记得进行正确的extern C声明。


16
如果没有其他指定,即在CMakeLists.txt的顶部,使用project(myproject),而不是使用例如project(myproject C) - congusbongus
2
或者完整拼写为 project(myproject LANGUAGES C CXX)。当您没有指定任何语言时,启用C和CXX是默认的CMake行为。https://cmake.org/cmake/help/latest/command/project.html - user7610

12

CMake会自动完成这个过程。你可以在CMakeLists.txt文件中自由混合使用这两种类型的文件:

. . .
add_executable(
    my_program
    code.cpp
    more_code.c
)

我经常这样做,而且它总是有效的。


10
请注意需要使用C头文件保护。因此在code.cpp文件中需要添加extern "C" { #include "more_code.h" }语句。 - Unapiedra

12

CMake应该利用文件扩展名指定的相关编译器和链接器。如果您使用C和C ++的组合来编译和链接可执行文件,则可以这样说:

add_executable(MyEXE main.cpp myFile.c)

我想要补充一个非常琐碎的观点。

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

project(MyProject C CXX)

添加CMake文件时应自动完成此操作,但根据添加文件的顺序,参数可能仅包括C或CXX。

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


1 或者您可以省略语言参数,此时将选择默认参数C和CXX。请参见此处


8
你可以将源文件的LANGUAGE属性设置为"CXX"。请查看文档。 文档

更新的链接 https://cmake.org/cmake/help/v2.8.8/cmake.html#command%3Aset_source_files_properties - PunyCode

2
和之间的区别基本上在于向链接器传递了<-lstdc++>,只需将C ++标准库作为C ++模块的显式依赖项即可。

明确一下,可以编译C ++代码。在这方面,和是相同的。唯一的区别是使用时您不必显式告诉编译器链接到libstdc ++。


谢谢,我已经重新修改了问题。这部分没问题,但我想知道如何为特定的子目录指定gcc/g++。 - Cartesius00
如果可以直接使用gcc并在必要时明确依赖于libstdc ++,那么为什么需要在某些子目录上使用g ++呢? - bames53
1
@James:gcc可以作为g++的前端:编译器是根据文件扩展名来选择的。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接