是否有可能拥有一个C静态库API,它在内部使用C++并将其隐藏在库的用户中?
我写了一个便携式C++库,我想静态链接到iPhone应用程序.
我使用Max OS X'静态库'模板创建了一个Xcode项目,并使用(extern"C")复制源代码,以及编写C wapper(处理异常).
我试图在另一个Cocoa iPhone应用程序中使用生成的库(.a文件).
如果我在调用ObjectiveC文件上使用(.mm)扩展并在库中的实现类上使用(.cpp),那么一切都很好.
但是当我尝试将包装器文件更改为(.c)扩展时,我在链接时得到未解析的符号,即使所有包装器函数文件都只是C函数.
因为C++是在库内部使用的,它是否意味着在外部它仍然必须被视为C++程序.无论如何都没有强制执行这种抽象?
编辑:谢谢你的回复,
我一直在使用extern"C",我只是不确定调用项目中需要哪些配置.即.如果调用的预测将需要知道它是否使用C++或可能是无知的并认为它是纯C库.
看起来我不能,我必须在ObjectiveC类上使用(.mm)文件.
在评论中这样做太难了,所以我只是想快速向你展示你所拥有的链接问题.当Xcode遇到文件时,它使用基于后缀的构建规则来决定使用哪个编译器.默认情况下,gcc将文件链接到标准C库,但不链接到标准C++库.存档文件(静态库)根本没有完成链接解析.它们基本上是需要链接的目标文件的存档.由于项目中没有.mm或.cpp文件,因此永远不会调用g ++,并且您的文件永远不会链接到标准库.要解决此问题,只需将标准C++库添加到Xcode项目中的其他链接器标志,或者只是将它们添加到预定义的其他标志选项中作为-l(例如,-lstdc ++).
这是一个快速演示:
stw.h:
#ifdef __cplusplus extern "C" #endif void show_the_world(void);
stw.cpp:
#include#include "stw.h" using namespace std; extern "C" void show_the_world() { cout << "Hello, world!\n"; }
建立图书馆:
$ g++ -c stw.cpp -o stw.cpp -O0 -g $ ar rcs stw.a stw.o
使用C应用程序中的库:
myapp.c:
#include "stw.h" int main() { show_the_world(); return 0; }
构建C应用程序:
$ gcc -o myapp myapp.c stw.a -lstdc++ -g -O0 $ ./myapp Hello, world! $
如果你尝试在没有-lstdc ++的情况下进行编译,你将得到所有未解决的问题,因为C编译器绝对不知道它应该链接到C++运行时(为什么会这样,对吧!?!?)所以你必须添加这个手动.您拥有的另一个选择是更改项目的构建规则...而不是让Xcode使用gcc来构建.c和.m文件,告诉它使用g ++,您的问题将得到解决.