Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 混合C和C++;与CMAKE_C++_C_Gcc_G++_Cmake - Fatal编程技术网

C++ 混合C和C++;与CMAKE

C++ 混合C和C++;与CMAKE,c++,c,gcc,g++,cmake,C++,C,Gcc,G++,Cmake,我们主要用C编写应用程序,但有些子模块是用C++编写的(在Linux上)。问题是如何编写CMakeLists.txt文件,以便对某些子目录使用g++,对另一个子目录使用gcc。g++和gcc之间的区别基本上是g++将-lstdc++传递给链接器。只需将C++标准库添加为C++模块的显式依赖项。 明确,GCC可以编译C++代码。gcc和g++在这方面是相同的。不同之处在于,当使用g++时,您不必显式地告诉编译器链接到libstdc++。您可以将源文件的语言属性设置为“CXX”。请参阅。如果没有其他

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

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

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

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

如果没有其他设置,编译器和链接器通常由文件扩展名确定。因此,只要文件结尾没有问题,代码就会被编译并与正确的编译器链接


在一个旁注,记住正确的外部C声明,如果你混合C和C++。

< P> CFAUK自动地这样做。您可以在CMakeLists.txt文件中自由混合这两种类型的文件:

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

我一直都这样做,而且很有效

CMake应使用文件扩展名指定的相关编译器和链接器。在编译和链接到C和C++的可执行文件的情况下,你会说:

add_executable(MyEXE main.cpp myFile.c)
我想补充一点微不足道的问题

在本例中,必须确保项目具有正确的语言名称参数,即1:

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

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



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

谢谢,我已经改写了问题。这部分没问题,但我想知道,如何为特定子目录指定gcc/g++。如果您可以只使用gcc,并在必要时显式依赖libstdc++,那么在某些子目录上使用g++有什么必要?@James:gcc可以充当g++的前端:编译器是从文件扩展中选择的。请注意,您需要C-header保护。因此,在code.cpp中,你会说
extern“C”{include“more_code.h”}
“如果没有其他设置”,即在
CMakeLists.txt
的顶部,使用
project(myproject)
而不是说
project(myproject C)
@congusbongus你救了我一天!
project(MyProject C CXX)