想问下 xcode 编译 c++代码和 linux 下或用 NDK 编译有什么不同的吗???同样的代码,只有 xcode 下编就一大堆错误

2016-10-12 01:16:28 +08:00
 wbing

事情是这样的:

最近需要把自己部门的一个动态库(支持 Windows 和 Linux)提供给其他部门让他们去编译成安卓以及 IOS 可用的版本.

在安卓下,他们写了个 makefile 去用 NDK 去编译,不用改动到 C++代码,就直接编译成功了.

而在 IOS 下,却出现一大堆错误,各种头文件没包含进去之类的,需要在代码里面加...........

例如这样的文件:

头文件a.h

#ifndef _A_H
#define _A_H
#define HANDLE void*
#endif

头文件b.h

#ifndef _B_H
#define _B_H
int pp(HANDLE A);
#endif

源文件 main.cpp

#include<iostream>
#include "a.h"
#include "b.h"
using namespace std;

int main()
{
    return 0;
}

编译时 xcode 就会提示 b.h 中,HANDLE 为未定义

然后那个负责 IOS 的那个人一直说我们这边代码不规范(这点我承认,但我又不知道说什么,我只是个新来的,代码也都不是我写的),总之感觉他满满的怨念.

我不懂 ios,所以想问下 xcode 去编译 c++的代码,和 windows,Linux,Android 下去编译有什么不同??为何其他几个都能编译通过,就 xcode 编不过.

1699 次点击
所在节点    问与答
4 条回复
acros
2016-10-12 01:36:58 +08:00
xcode 用的 clang ,编译要求确实有差异,还有像路径选择之类的(包含路径时 clang 好像只认\, vs 编译器就正反斜杠都可以),这个看经验了,要不然就自己先编译一遍做检查。 即使非常了解 gcc clang vs 编译器实现的区别,也不敢过一个就打赌跨平台再编肯定成功啊
longear
2016-10-12 01:51:15 +08:00
试试 Build Settings -> Search Paths -> Header Search Paths ” 中添加头文件的搜索路径

严格来说在 b.h 需要再 #include "a.h" 才会有 HANDLE 的定义, 这种情况在 gcc 下确实也能编译通过。
反正我都会把共用的类型单独定义,或者个别的再包含一次。
bsidb
2016-10-12 08:51:12 +08:00
楼主这个代码看起来没问题啊~ 是不是 XCode 将.h 文件当做源代码文件进行了编译?
楼主可以在命令行里试试"clang main.cpp",只编译 main 。

编译器在处理时,只会将 a.h 和 b.h 在 main.cpp 中进行展开,因为楼主 include 的顺序已经设置好了,所以不会出现未定义的问题。
bsidb
2016-10-12 08:54:01 +08:00
@bsidb 如果 XCode 将.h 当做源代码了,那么确实会报出未定义 HANDLE 的问题。 不过风格良好的.h 文件应该将他依赖的.h 文件也 include 进来。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/312076

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX