当前位置:首页 » 编程软件 » ios交叉编译

ios交叉编译

发布时间: 2022-06-30 12:51:47

① 如何通过cython调用objective-c的类,交叉编译到IOS上

可以放到项目文件里编译,就可以防止交叉编译, 另外include主要需要结构上的管理,也就是通过技术管理的方法进行规避。 如果多人开发团队任意include, 你通过编译时的技术手段很难管理好
用pthread实现跨平台。 用cocoa的NSTread或是GCD是无法跨平台的。 你也许会oc的多线程,但在跨平台开发的时候果断摒弃掉吧。
在我开始使用OpenAphid-Engine的时候,已经有几种类似的iOS/Android 项目.这些商业项目或者开源项目使用javaScript实现代码特性。比如,Titanium 和PhoneGap 允许开发者使用JavaScript开发本地 iOS/Android apps;ngCore 更是可以使用纯正的JavaScript构建跨平台的游戏。JavaScript已经成为了编程语言中的佼佼者,也因为更容易学习吸引了众多开发者参与到这一领域。

怎样在IOS/Android上使用JavaScript

主要有两种方法。一种是使用系统的浏览器组件(IOS中的UIWebView和Android中的WebView),另一方法就是使用整合好的JavaScript引擎。
使用系统的浏览器组件比较容易实现但是更复杂,效率也低。 WebView提供了 addJavascriptInterface 把Java classes注入到JavaScript文本的方法。但是它只支持最原始的几种数据类型,因此也局限了API设计。并且在Android 2.3模拟器上不稳定,在真机上也会遇到 issue #12987的问题。在IOS上更糟 UIWebView没有公共的APIs支持JavaScript到Objective-C的交互(你必须使用似有的APIs才能达到与addJavascriptInterface相同的功能)。

② uap mobile使用交叉编译技术,与appcan apicloud相比,效率如何

当前移动平台开发方面的主流技术大体分三种:Web技术(Javascript、css3、HTML5)、Native技术(Java、C/C++、C#原生)及Hybird混合技术(HTML+Native混合)。据张建新介绍,目前,采用HTML和Hybird混合开发技术的App更多些,比如Bai Clouda、IBM Worklight、Intel App mobi、Oracle ADF mobile等,而原生的如Titanium、SUP Android/iOS等相对较少。相比较而言,HTML的优势在于实现简单,而Native在性能和表现力上更好,Hybird混合技术则可以整合HTML5 Web应用与本地容器(native container),前者具有可移植性,而后者可以协助访问本地设备功能。

③ iOS面试题有哪些

iOS面试题主要有:
1、多线程、特别是NSOperation 和 GCD 的内部原理。
2、运行时机制的原理和运用场景。
3、SDWebImage的原理。实现机制。如何解决TableView卡的问题。
4、block和代理的通知的区别。block的用法需要注意些什么。
5、strong,weak,retain,assign, nomatic 等的区别。
6、设计模式,mvc,单利,工厂,代理等的应用场景。
7、单利的写法。在单利中创建数组应该注意些什么。
8、NSString 的时候用和strong的区别。
9、响应值链。
10、NSTimer 在子线程中应该手动创建NSRunLoop ,否则不能循环执行。
11、UIScrollView和NSTimer组合做循环广告图轮播的时候有一个属性可以控制当上下滚动tableview的时候广告轮播图依然正常滚动。
12、Xcode最新的自动布局。
13、git ,和svn的用法,git的几个命令。
14、友盟报错可以查到具体某一行的错误,原理是什么。
15、Instrument 可以检测 电池的耗电量、和内存的消耗。的用法。
16、动画CABaseAnimation CAKeyAni…. CATrans….. CAGoup…. 。
17、ARC的原理。

④ 如何实现protobuf在XCODE上armv7/armv7s/i386的交叉编译

步骤一:部署protoc.exe

1)sudo su ---进入管理模式

//以下操作切换至protobuf文件夹

2)./configure

3)make

4)make check

5)make install

此时可以查看protobuf文件夹下面的makefile文件,可以查看-build表示的本机环境以及-host表示的编译库的运行环境

我本地的-build=x86_64-apple-darwin12.3.0

-host=x86_64-apple-darwin12.3.0

(这两个参数在后续配置脚本需要用到,与后面脚步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0后缀“arm-apple-darwin12.3.0”保持一致)

6)make distclean清理已生成的makefile,为交叉编译配置新makefile做准备

步骤二:配置交叉编译

1)执行脚本ios-build.sh,脚本内容如下:

configure_for_platform() {

export PLATFORM=$1

#export PLATFORM=iPhoneOS

echo "Platform is ${PLATFORM}"

if [ "$PLATFORM" == "iPhoneSimulator" ]; then

export ARCHITECTURE=i386

export ARCH=i686-apple-darwin12.3.0

fi

if [ "$PLATFORM" == "iPhoneOS" ]; then

export ARCHITECTURE=$2

export ARCH=arm-apple-darwin12.3.0

fi

export ARCH_PREFIX=$ARCH-

export SDKVER="6.1"
#sdk版本号必须正确

export
DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer

export SDKROOT="$DEVROOT/SDKs/${PLATFORM}$SDKVER.sdk"

export
PKG_CONFIG_PATH="$SDKROOT/usr/lib/pkgconfig:$DEVROOT/usr/lib/pkgconfig"

export AS="$DEVROOT/usr/bin/as"

export ASCPP="$DEVROOT/usr/bin/as"

export AR="$DEVROOT/usr/bin/ar"

export RANLIB="$DEVROOT/usr/bin/ranlib"

#export CPP="$DEVROOT/usr/bin/c++"

#export CXXCPP="$DEVROOT/usr/bin/c++"

export CC="$DEVROOT/usr/bin/gcc"

export CXX="$DEVROOT/usr/bin/g++"

export LD="$DEVROOT/usr/bin/ld"

export STRIP="$DEVROOT/usr/bin/strip"

export LIBRARY_PATH="$SDKROOT/usr/lib"

export CPPFLAGS=""

⑤ 有没有讲mac上交叉编译ios库的相关书籍

1、首先在 MacBook Air 关上的情况下,按着 Command 及 R 两个按键不放手,然后同时按下最右上角的开关键一下(记着此时仍然继续按着 Command + R 键)。
2、当进入至此接口后,就可以放开所有按键。当中有 4 个选项:Restore From Time Machine Backup 是从你过去备份至 Time Machine 的映像档回复电脑、Reinstall Mac OS X 顾名思义就是重新安装 Mac OS X Lion、Get Help Online 则是从线上撷取帮助档了解重装步骤及常见问题、而最后的 Disk Utility 则是管理硬盘之用,包括:分割磁区、将磁盘区格式化等。
3、在画面右上角,可以连接 Wi-Fi,建议大家必须连接,以确保下载及安装过程一切顺利。
4、点按“Get Help Online”就可以看到回复系统的所有资料及步骤。
5、最有趣的是,它其实是一个完整版的 Safari,在此已可以上网浏览网页。
6、如果点按 Restore From Time Machine Backup,就可以进入此接口。记着此时要将过去用作 Time Machine 备份的外置硬盘与 MacBook Air 接驳,再点按“Continue”。
7、如果已接驳了硬盘,应可在此页看到过去的备份档,只要选取了再点按“Continue”就可以将 MacBook Air 回复至备份时的情况。由于未有使用 Time Machine,所以不在此再多述此项功能了。
8、点按“Partitions”,再拉动下方左侧白色部分右下角的位置,就可以调节使用 Macintosh HD 的部分。完成后再在右方点按未设定的部分,再建立新磁区就可以了。当然,安装了 Mac OS X Lion 后,大家亦随时可以在“Utilities”中的“Disk Utility”进行这项动作。
9、点按“Reinstall Mac OS X”,然后会弹出在安装前会先与 Apple 的服务器取得认证,记得此时一定要接驳互联网,然后点按“Continue”继续。
10、点按“Reinstall Mac OS X”,然后会弹出在安装前会先与 Apple 的服务器取得认证,记得此时一定要接驳互联网,然后点按“Continue”继续。
11、会看到一段 Agreement,点按“Agree”后再点按上方的“Agree”即可。
12、再选择希望将 Mac OS X Lion 安装到哪个磁盘区。
13、开始重装了,等等吧!这个下载步骤大约需要 1 小时左右(在 Wi-Fi 连线情况下)。

⑥ ios之javascriptcode怎么用

在我开始使用OpenAphid-Engine的时候,已经有几种类似的iOS/Android 项目.这些商业项目或者开源项目使用JavaScript实现代码特性。比如,Titanium 和PhoneGap 允许开发者使用JavaScript开发本地 iOS/Android apps;ngCore 更是可以使用纯正的JavaScript构建跨平台的游戏。JavaScript已经成为了编程语言中的佼佼者,也因为更容易学习吸引了众多开发者参与到这一领域。 怎样在IOS/Android上使用JavaScript 主要有两种方法。一种是使用系统的浏览器组件(IOS中的UIWebView和Android中的WebView),另一方法就是使用整合好的JavaScript引擎。 使用系统的浏览器组件比较容易实现但是更复杂,效率也低。 WebView提供了 addJavascriptInterface 把Java classes注入到JavaScript文本的方法。但是它只支持最原始的几种数据类型,因此也局限了API设计。并且在Android 2.3模拟器上不稳定,在真机上也会遇到 issue #12987的问题。在IOS上更糟 UIWebView没有公共的APIs支持JavaScript到Objective-C的交互(你必须使用似有的APIs才能达到与addJavascriptInterface相同的功能)。 PhoneGap 是基于 UIWebView and WebView的比较出名的项目。开发者被迫使用回调函数从JavaScript APIs得到返回值。这在游戏上效率极低,也更为复杂。 早期的ngCore同样依赖UIWebView来支持iOS。但是这个机制由于其糟糕的表现被取代。 为了获得更好的表现、灵活性、兼容性,嵌入全功能的JavaScript引擎变得更为有效。 选择JavaScript 引擎 据我所知,iOS 或 android 上能够运行的JavaScript 引擎有4个: JavaScriptCore, SpiderMonkey, V8 and Rhino.下面这个表格展示各个引擎在iOS 和 Android 的兼容性 当我设计 OpenAphid-Engine 成为一个合适的Javascript的引擎的时候,我主要考量以下指标: 兼容性:同时支持iOS 和 Android 在x86 和 ARM 平台上的 模拟器和 设备。 稳定性. 稳定的运行在对应的平台和CPU的架构上。 扩展性. 能够很方便的利用本地特性进行扩展。例如OpenAphid-Engine 通过一个桥接层,实现了通过Javascript 进行OpenGL ES 的使用。 性能好:一个快速的Javascript 引擎主要归结为两个因素:有效的绑定机制和进行较低的开销。. OpenAphid-Engine 在渲染一帧页面的时候通过JavaScript触发数百个OpenGL ES调用来进行渲染。这点是非常有意义的,如果只是把开销放到单纯的执行JavaScript上进行将会导致渲染很慢,。 体积小.:在内存的占用上和自身的执行文件上都要比较小。 Rhino和 V8出现的最早,但是不支持iOS。我非常希望可以使用 V8开发 OpenAphid-Engine ,在初次使用时就发现它拥有优雅的代码结构,良好的表现,但是我非常失望,因为 V8只能在JIT模式下使用,而IOS不支持。除非你使用jailbroken设备。(详情请参考 issue #1312) 我在JavaScriptCore和SpiderMonkey间纠结了很久。在成功部署了Android和IOS项目后,我通过实验找到更好的一个。 SpiderMonkey 容易得到开发权限,但是在与JavaScriptCore比较时甘拜下风。SpiderMonkey产生了大量的二进制文件 (在ARMv7上大约1.3MB);JavaScript执行得更慢,在JavaScript和C++的桥接表现更为重要。另外一个让我远离SpiderMonkey的原因是在iOS模拟器上出现随机崩溃现象。 JavaScript引擎会受很多东西影响,比如交叉编译器的版本、引擎的版本和操作系统的种类等。下表列举了几种运行在iPod Touch 4上引擎的运行时间。(有兴趣请于Google Doc查看精确的时间) JavaScriptCore 大比分领先。 我没有找到SpiderMonkey,所以就使用了下面的三种自定义搭建Cocos2d-iPhone-2.1-beta4, Cocos2d-x-2.1-beta3和iMonkey。 所有测试的apps都基于LLVM 4.1版本,所有的引擎都运行在解释器模式(iOS受限)。 几种基准的介绍: 1m-js_loop执行空循环一百万次。 1m-native_function请求调用一百万次返回undefined的本地函数 1m-js_function跟上面一个相同,只是换成了JavaScript。 fib(30)递归的方式计算Fibonacci(30)。 sudoku-5用这里的算法解决Sudoku问题。 1m-native_function JavaScriptCore使用可移植的C APIs实现,当然这不是最有效引入本地函数的方法。 SpiderMonkey 在台式电脑上由于高级的JIT追踪方法运行更快,但是在IOS设备上却与之相反。 在大部分的基准上,使用iMonkey比SpiderMonkey更快 很明显的,使用SpiderMonkey将会在iOS上获得更好的表现。ngCore 1.10在iOS上加入自定义功能,所以要更优于像SpiderMonkey这样的变体。 对于JavaScript Code 的挑战 在我专心于 JavaScriptCore之后,我的研究更进了一步: 1. 它在运行 一百万 次 native_function和 一百万次Math.abs(0) 的时间六倍于 使用 JavaScriptCore.我观察到同样的性能问题出现在通过注入的方式访问对象的属性。 2. 利用 C APIs 进行设计虽然开发简单,但是缺乏灵活的内存管理机制。缺乏一个高级的内部垃圾回收机制很难解决类似于 circular references 的问题。 3. 众多的 JavaScriptCore 正式版本都是可用的 。 不过 OpenAphid-Engine 是更好的一个,它不但速度快,而且相当小。 我抛弃了原来的使用 C APIs 方案因此解决了 问题 1 和 2. 使用的JSC 版本来自于iOS4.3.3,因为同样在解析器模式下这个版本相比来自于iOS 5 的版本更快,执行文件更小。 在其他产品上使用的JS引擎 在开发OpenAphid-Engine期间,我一直保持对其他引擎的关注,以下这个表格总结了其他JS引擎的使用情况

⑦ ios开发高手进!!objective-c的#import 会将头文件的内容全部包含到.m文件中吗它是怎么防止交叉编译的

可以放到项目文件里编译,就可以防止交叉编译,
另外include主要需要结构上的管理,也就是通过技术管理的方法进行规避。

如果多人开发团队任意include, 你通过编译时的技术手段很难管理好

⑧ ios import <> 和 的区别

#import比起#include的好处就是不会引起交叉编译
在 Objective-C中,#import 被当成 #include 指令的改良版本来使用。除此之外,#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import
@class就是告诉编译器有这么一个类,至于类的定义是啥不知道
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import
#import<> 跟 #import""又什么区别?
“”的意思是自己创建的文件,用这个首先会在当前的目录中寻找,如果找不到就到其他的位置寻找,“”和<>是相对的一个是自己创建的文件一个是系统的文件

⑨ 如何使用clang+llvm+binutils+newlib+gdb搭建交叉编译环境

1,Build llvm/clang/lldb/lld 3.5.0等组件

1.0 准备:

至少需要从llvm.org下载llvm, cfe, lldb, compiler-rt,lld等3.5.0版本的代码。

$tar xf llvm-3.5.0.src.tar.gz

$cd llvm-3.5.0.src

$mkdir -p tools/clang
$mkdir -p tools/clang/tools/extra
$mkdir -p tools/lld
$mkdir -p projects/compiler-rt

$tar xf cfe-3.5.0.src.tar.xz -C tools/clang --strip-components=1
$tar xf compiler-rt-3.5.0.src.tar.xz -C projects/compiler-rt --strip-components=1
$tar xf lldb-3.5.0.src.tar.xz -C tools/clang/tools/extra --strip-components=1
$tar xf lld-3.5.0.src.tar.xz -C tools/lld --strip-components=1
1.1 【可选】使用clang --stdlib=libc++时,自动添加-lc++abi。

libc++组件可以使用gcc libstdc++的supc++ ABI,也可以使用c++abi,cxxrt等,实际上自动添加-lc++abi是不必要的,这里这么处理,主要是为了方便起见。实际上完全可以在“clang++ -stdlib=libc++”时再手工添加-lc++abi给链接器。

这里涉及到链接时DSO隐式还是显式的问题,早些时候ld在链接库时会自动引入由库引入的依赖动态库,后来因为这个行为的不可控性,所以ld链接器的行为做了修改,需要显式的写明所有需要链接的动态库,才会有手工添加-lc++abi这种情况出现。

--- llvm-3.0.src/tools/clang/lib/Driver/ToolChain.cpp 2012-03-26 18:49:06.663029075 +0800
+++ llvm-3.0.srcn/tools/clang/lib/Driver/ToolChain.cpp 2012-03-26 19:36:04.260071355 +0800
@@ -251,6 +251,7 @@
switch (Type) {
case ToolChain::CST_Libcxx:
CmdArgs.push_back("-lc++");
+ CmdArgs.push_back("-lc++abi");
break;

case ToolChain::CST_Libstdcxx:
1.2 【必要】给clang++添加-fnolibgcc开关。

这个开关主要用来控制是否连接到libgcc或者libunwind。

注:libgcc不等于libunwind。libgcc_eh以及supc++的一部分跟libunwind功能相当。

注:libgcc_s和compiler_rt的一部分相当。

这个补丁是必要的, 不会对clang的正常使用造成任何影响 ,只有在使用“-fnolibgcc"参数时才会起作用。

之所以进行了很多unwind的引入,主要是为了避免不必要的符号缺失麻烦,这里的处理相对来说是干净的,通过as-needed规避了不必要的引入。

--- llvm-static-3.5.0.bak/tools/clang/lib/Driver/Tools.cpp 2014-09-10 13:46:02.581543888 +0800
+++ llvm-static-3.5.0/tools/clang/lib/Driver/Tools.cpp 2014-09-10 16:03:37.559019321 +0800
@@ -2060,9 +2060,15 @@
".a");

CmdArgs.push_back(Args.MakeArgString(LibClangRT));
- CmdArgs.push_back("-lgcc_s");
- if (TC.getDriver().CCCIsCXX())
- CmdArgs.push_back("-lgcc_eh");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else {
+ CmdArgs.push_back("-lgcc_s");
+ if (TC.getDriver().CCCIsCXX())
+ CmdArgs.push_back("-lgcc_eh");
+ }
}

static void addProfileRT(
@@ -7150,24 +7156,50 @@
bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
Args.hasArg(options::OPT_static);
+
+
+
if (!D.CCCIsCXX())
- CmdArgs.push_back("-lgcc");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else
+ CmdArgs.push_back("-lgcc");

if (StaticLibgcc || isAndroid) {
if (D.CCCIsCXX())
- CmdArgs.push_back("-lgcc");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else
+ CmdArgs.push_back("-lgcc");
} else {
if (!D.CCCIsCXX())
CmdArgs.push_back("--as-needed");
- CmdArgs.push_back("-lgcc_s");
+ if (Args.hasArg(options::OPT_fnolibgcc))
+ CmdArgs.push_back("-lunwind");
+ else
+ CmdArgs.push_back("-lgcc_s");
if (!D.CCCIsCXX())
CmdArgs.push_back("--no-as-needed");
}

if (StaticLibgcc && !isAndroid)
- CmdArgs.push_back("-lgcc_eh");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else
+ CmdArgs.push_back("-lgcc_eh");
else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
- CmdArgs.push_back("-lgcc");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else
+ CmdArgs.push_back("-lgcc");

// According to Android ABI, we have to link with libdl if we are
// linking with non-static libgcc.
--- llvm-static-3.5.0.bak/tools/clang/include/clang/Driver/Options.td 2014-08-07 12:51:51.000000000 +0800
+++ llvm-static-3.5.0/tools/clang/include/clang/Driver/Options.td 2014-09-10 13:36:34.598511176 +0800
@@ -788,6 +788,7 @@
def fomit_frame_pointer : Flag<["-"], "fomit-frame-pointer">, Group<f_Group>;
def fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
def fopenmp_EQ : Joined<["-"], "fopenmp=">, Group<f_Group>, Flags<[CC1Option]>;
+def fnolibgcc : Flag<["-"], "fnolibgcc">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
def fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group<f_Group>;
def foptimize_sibling_calls : Flag<["-"], "foptimize-sibling-calls">, Group<f_Group>;
def force__cpusubtype__ALL : Flag<["-"], "force_cpusubtype_ALL">;
1.3 llvm的其他补丁。

llvm/clang将gcc toolchain的路径hard code在代码中,请查阅tools/clang/lib/Driver/ToolChains.cpp。

找到x86_64-redhat-linux之类的字符串。

如果没有你系统特有的gcc tripple string,请自行添加。

这个tripple string主要是给llvm/clang搜索gcc头文件等使用的,不影响本文要构建的toolchain

1.4 构建clang/llvm/lldb

本文使用ninja。顺便说一下,llvm支持configure和cmake两种构建方式。可能是因为工程太大,这两种构建方式的工程文件都有各种缺陷(主要表现在开关选项上,比如configure有,但是cmake却没有等)。llvm-3.4.1就是因为cmake工程文件的错误而导致了3.4.2版本的发布。

综合而言,cmake+ninja的方式是目前最快的构建方式之一,可以将构建时间缩短一半以上。

mkdir build
cd build

cmake \
-G Ninja \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_CXX_FLAGS="-std=c++11" \
-DBUILD_SHARED_LIBS=OFF \
-DLLVM_ENABLE_PIC=ON \
-DLLVM_TARGETS_TO_BUILD="all" \
-DCLANG_VENDOR="MyOS" ..

ninja

ninja install
如果系统原来就有clang/clang++的可用版本,可以添加:

-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
这样就会使用系统的clang++来构建llvm/clang

2,测试clang/clang++。

自己找几个简单的c/cpp/objc等编译测试一下即可。完整测试可以在构建时作ninja check-all

3,libunwind/libc++/libc++abi,一套不依赖libgcc, libstdc++的c++运行库。

3.1 从https://github.com/pathscale/libunwind 获取代码。

libunwind有很多个实现,比如gnu的libunwind, path64的libunwind,还有libcxxabi自带的Unwinder.

这里作下说明:

1),gnu的libunwind会有符号缺失和冲突。

2),libcxxabi自带的Unwinder是给mac和ios用的,也就是只能在darwin体系构建。目前Linux的实现仍然不全,等linux实现完整了或许就不再需要path64的unwind实现了。

暂时建议使用pathscale的unwind实现。

mkdir -p build
cd build
cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS="-m64" ..
ninja

mkdir -p /usr/lib
cp src/libunwind.so /usr/lib
cp src/libunwind.a /usr/lib
3.2 第一次构建libcxx.

必须先构建一次libcxx,以便后面构建libcxxabi。这里构建的libcxx实际上是使用gcc的libgcc/stdc++/supc++的。

打上这个补丁来禁止libgcc的引入:

diff -Nur libcxx/cmake/config-ix.cmake libcxxn/cmake/config-ix.cmake
--- libcxx/cmake/config-ix.cmake 2014-06-25 06:57:50.000000000 +0800
+++ libcxxn/cmake/config-ix.cmake 2014-06-25 09:05:24.980350544 +0800
@@ -28,5 +28,4 @@
check_library_exists(c printf "" LIBCXX_HAS_C_LIB)
check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
-check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB)
编译安装:

mkdir build
cd build
cmake \
-G Ninja \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
..
ninja
ninja install
3.3,测试第一次构建的libcxx。

使用"clang++ -stdlib=libc++ -o test test.cpp -lstdc++"编译简单c++代码,检查是否出错。(如果前面构建clang是已经apply了c++abi的链接补丁,这里会出现找不到c++abi的情况,跳过即可)

使用"ldd test"查看test二进制动态库使用情况。可以发现,test依赖于libgcc_s/libc++/libstdc++。(多少有些不爽了吧?使用了libc++居然还要依赖libstdc++?)

热点内容
威兰达四驱豪华版都有哪些配置 发布:2025-02-12 16:54:34 浏览:120
nokia恢复出厂密码是多少 发布:2025-02-12 16:49:03 浏览:276
什么是系统相册缓存 发布:2025-02-12 16:49:02 浏览:521
怎么创建密码重置盘 发布:2025-02-12 16:36:59 浏览:676
php读取时间 发布:2025-02-12 16:23:48 浏览:385
祛痘液如何配置 发布:2025-02-12 16:21:22 浏览:748
安卓手机如何拷贝电脑里 发布:2025-02-12 16:16:30 浏览:860
linux怎么编译内核 发布:2025-02-12 16:03:02 浏览:189
新的怎么注册微信账号密码忘了怎么办 发布:2025-02-12 15:50:08 浏览:660
android代码搜索 发布:2025-02-12 15:45:36 浏览:779