编译和链接C和C ++文件

我想从C文件中调用C ++函数,我已经阅读了有关extern“C”构造和包装器API的内容。 但是,我不确定如何组织各种头文件以及如何链接目标文件。

假设我有一个C文件MyProg.c及其相应的头文件MyProg.h

现在,我创建了两个文件Wrapper.cppWrapper.h ,它们声明了我希望从MyProg.c调用的函数。

// Wrapper.h #include "Utility.h" #ifdef __cplusplus extern "C" { #endif void func_to_invoke(); #ifdef __cplusplus } #endif 

请注意,Wrapper.h包含一个包含其他实用程序C ++函数的文件。

问题是如何编译和链接文件。 我应该做以下事情:

 g++ -c Utility.cpp Utility.h g++ -c Wrapper.cpp Wrapper.h Utility.h gcc -c MyProg.c MyProg.h Wrapper.h gcc MyProg.o Wrapper.o 

编辑:

我尝试过以下内容,但仍然无法编译。 我有与C ++库相关的页面和错误页面。 我是否还要在__cplusplus宏中声明Utility.h中的所有函数?

 g++ -c Utility.cpp g++ -c Wrapper.cpp gcc -c MyProg.c g++ MyProg.o Wrapper.o Utility. 

解:

必须从Wrapper.h中删除Utility.h并将其包含在Wrapper.cpp中

不要在Wrapper标头中包含.cpp文件。 这完全是错误的做法。 甚至不包括Utility.h标头。 只需定义您的包装函数。 然后在Wrapper.cpp中包含Utility.h头文件并定义包装器函数。

如果您的C ++代码使用exception或运行时类型信息,则需要使用g ++进行最终链接。 您的程序将需要C ++支持库。

我会这样写:

 g++ -c Utility.cpp g++ -c Wrapper.cpp gcc -c MyProg.c g++ -o MyProg Utility.o MyProg.o Wrapper.o 

一旦你将Wrapper.cpp编译成目标代码,它的内容是否先前用C或C ++编写并不重要,只要你使用extern "C"告诉编译器跳过func_to_invoke名称func_to_invoke

如果我记得很清楚, gccg++都可以检测他们的输入文件是否包含C或C ++代码并做正确的事情,但gcc将链接C标准库和g++与C ++的链接,所以你最终可能会丢失一些function。

我认为最好的做法是将gcc用于任何不使用任何C ++特性的东西 ,就像C一样, g++用于其他所有东西。

你应该在最后一行包括Utility.o.