我想从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
中答案 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
的名称重整。
如果我记得很清楚,gcc
和g++
都可以检测他们的输入文件是否包含C或C ++代码并做正确的事情,但gcc
将链接到C标准库和g++
对抗C ++,所以你最终可能会缺少一些功能。
我认为最好的做法是将gcc
用于不使用任何C ++功能的任何内容,就像C和{{1其他一切。
答案 2 :(得分:0)
你应该在最后一行包含Utility.o。