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

时间:2011-11-11 16:21:03

标签: c++ c gcc g++ cmake

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

5 个答案:

答案 0 :(得分:18)

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

另外,如果你混合了C和C ++,请记得做出正确的extern C声明。

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

g ++和gcc之间的区别基本上是g ++将-lstdc ++传递给链接器。只需添加c ++标准库作为c ++模块的显式依赖项。

要明确,gcc可以编译C ++代码。 gcc和g ++在这方面是相同的。不同之处仅在于使用g ++时,您不必明确告诉编译器链接到libstdc ++。

答案 4 :(得分:1)

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 的默认参数。见here