xcode9.4 C/C++和objc混编遇到的问题

现在做的项目是用objc开发UI,C/C++来开发底层的逻辑和业务,我负责的是C/C++部分为UI部分提供逻辑和业务的API。我们之前都是我这边打包成framework形式给UI,但是最近在使用xcode工具自带的leads工具检查项目是否有内存泄漏的时候,我打包成framework这个形式,并leads工具不能找到泄漏的代码地方,而是十六进制的汇编语言,这明显是看不懂的。所以,我们决定不实用framework形式,直接把我的源码整合到UI部分,直接运行。但是问题出现了,编译出错了。但是经过一天的时间把这个问题解决了,在网上搜了很多方法都是不行,所以今天记录一下我们解决过程。

首先,先说一下,我打包成framework给UI部分怎么使用?

这个网上很多,就是framework使用c/c++来写(C/C++混编就不说了吧),UI部分使用framework,得提供.mm文件,在这个.mm文件中直接调用framework提供的接口来封装接口,然后UI部分(.m文件)再从.mm文件中调用封装好的接口。

然后,我把C/C++源码和objc混编怎么使用?

这里先说,我自己创建一个简单的工程,在工程中创建c++文件(.cpp)并且实现好简单的接口,再创建一个.mm文件调用.cpp接口,运行是ok的。 ===> 这个也是大多数C/C++源码和objc混编的方法。

对于我们实际项目:

我们的操作过程是:我直接把我的C/C++项目源码目录直接拖到objc的源码源码目录里面,然后在objc项目中添加刚加的C/C++目录,最后编译,出现很多头文件找不到,刚开始以为是路径问题,我们也设置好了环境搜索路径问题解决了但是新的问题出现了。


新的问题:大概说是很多函数(C/C++中)在.mm文件中重定义,开头是Undefined symbols for architecture xxx

但是发现,此时C/C++目录是蓝色的并不是黄色的。所以我们重新在UI部分的xcode中创建C/C++目录(包括子目录),然后将文件add进去,就问题解决了,但是又出现NSString没有定义问题。

在网上一番搜索,尝试了一下,将所有的.c的文件type default - c source改成objective - c source

将所有.cpp文件改成如下:

     =========>>>>>>>>        

再次编译,成功。

针对这种情况还有一种办法,就是将.c文件后缀改为.m,将.cpp文件后缀改为.mm。虽然没有尝试过,但是个人认为也是可行的。

网上还有一种说法就是修改C++编译器,将libc++改为libstdc++,但是由于本项目中使用到了一些c++11定义的东西,所以不能进行此方法,不然我还要修改我的源码。但是没有使用c++11定义的东西,也可以尝试一下此方法。



猜你喜欢

转载自blog.csdn.net/qq_31930499/article/details/80589887
9.4
今日推荐