最近需要把自己部门的一个动态库(支持 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 编不过.
1
acros 2016-10-12 01:36:58 +08:00 via iPhone 1
xcode 用的 clang ,编译要求确实有差异,还有像路径选择之类的(包含路径时 clang 好像只认\, vs 编译器就正反斜杠都可以),这个看经验了,要不然就自己先编译一遍做检查。 即使非常了解 gcc clang vs 编译器实现的区别,也不敢过一个就打赌跨平台再编肯定成功啊
|
2
longear 2016-10-12 01:51:15 +08:00 1
试试 Build Settings -> Search Paths -> Header Search Paths ” 中添加头文件的搜索路径
严格来说在 b.h 需要再 #include "a.h" 才会有 HANDLE 的定义, 这种情况在 gcc 下确实也能编译通过。 反正我都会把共用的类型单独定义,或者个别的再包含一次。 |
3
bsidb 2016-10-12 08:51:12 +08:00
楼主这个代码看起来没问题啊~ 是不是 XCode 将.h 文件当做源代码文件进行了编译?
楼主可以在命令行里试试"clang main.cpp",只编译 main 。 编译器在处理时,只会将 a.h 和 b.h 在 main.cpp 中进行展开,因为楼主 include 的顺序已经设置好了,所以不会出现未定义的问题。 |