当前位置:  开发笔记 > 编程语言 > 正文

使用iPhone ObjectiveC Apps中的C/C++静态库

如何解决《使用iPhoneObjectiveCApps中的C/C++静态库》经验,为你挑选了1个好方法。

是否有可能拥有一个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)文件.



1> Jason Coco..:

在评论中这样做太难了,所以我只是想快速向你展示你所拥有的链接问题.当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 ++,您的问题将得到解决.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有