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