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

时间:2014-03-03 18:11:08

标签: c++ c compilation

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

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

现在,我创建了两个文件 Wrapper.cpp Wrapper.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

3 个答案:

答案 0 :(得分:5)

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

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

我会这样写:

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

答案 1 :(得分:1)

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

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

我认为最好的做法是将gcc用于不使用任何C ++功能的任何内容,就像C和{{1其他一切。

答案 2 :(得分:0)

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