手头上有几个开源的 c++ static lib,用 cmake 编译出来是 for intel 的,怎样才能编译成 for arm 的呢,求指点

2015-05-22 14:10:46 +08:00
 forkon

我没做过这方面的工作,表述得不够专业,别笑哈。手头上这几个c++ lib原本是用在os x上面,由于项目需要现要把它移植到ios上用,想知道是直接修改编译选项就成(但愿如此),还是需要修改代码,求指点。

1405 次点击
所在节点    C
13 条回复
Septembers
2015-05-22 16:17:49 +08:00
xylophone21
2015-05-22 17:41:50 +08:00
这取决于你这个lib的依赖,如果它们依赖了os x上的专有接口,你指望能不修改源码?(除非开源项目已经写好了这些差异) 反之,如果它们仅依赖了stdc,posix等一些跨平台的库,那么修改编译选项还是有戏的。
forkon
2015-05-22 17:57:53 +08:00
@xylophone21 我手头上这几个c++ lib都是跨平台的,没有依赖os x上的专有接口,我想知道要对makefile文件作些什么修改才能达到目的呢,谢谢:)
forkon
2015-05-22 17:58:34 +08:00
@Septembers 好,这个我先看看,谢谢:)
xylophone21
2015-05-22 19:18:06 +08:00
@forkon 开源库用的什么makefile系统?

如果是CMAKE
@Septembers
说的是对的,主要看CMAKE_C_COMPILER等几个选项

如果是直接的makefile,看看有没有类似CC之类的变量

本质上说就是换一个gcc,然后与之配合的是一些flag,头文件,库文件的搜索路径。
forkon
2015-05-22 19:29:20 +08:00
@xylophone21 用的是cmake……有没有好的学习cmake的资料可看呢,中文的最好
xylophone21
2015-05-22 19:46:05 +08:00
@forkon 这个真没有找过,英文资料还比较好理解吧

主要看这几个选项。

CMAKE_C_COMPILER
CMAKE_CXX_COMPILER
CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
lijianying10
2015-05-23 00:08:28 +08:00
1. 其实您遇到的最大的问题不在于构建系统CMake上,因为这些资料都非常好整理。
2. Intel Compiler提供了针对不同CPU的优化,比如说AVX指令集之类的。如果遇到类似OpenMP一类的只涉及到预编译头的还好可以直接过去。如果遇到类似`__m512`之类的针对Intel独家CPU的结构体那就麻烦了,虽然概率不大。
3. 看依赖,我之前用过Intel Cluster Studio 不知道您说的lib是否依赖MKL或者IPP(支持android&ios)之类的,需要参照intel说明书,或者您应该到Intel Dev Zone 去提问。

基于以上的建议:

您目前着手的工作应该快速scan code。
必要的时候hack code去了解您需要的代码。
不然始终都是抓瞎。
慢慢了解了之后可以了解几个问题:
1. 问题到底有多复杂
2. 移植工程到底有多大
3. 是否有类似的工作已经做出来了
等等值得思考的事。

希望能对楼主有所帮助
forkon
2015-05-23 00:31:21 +08:00
@lijianying10 你的回答很高深对于我这个cmke小白来说……我现在在做librime(一个很棒的开源输入法引擎)的移植工作,想将它弄到ios上去……如你所说的,我现在确实不知道问题到底有多复杂,移植工程到底有多大 ,不过可以肯定类似的工作还没人做过。我只知道我现在很想将它移植过去!

需要重新编译的lib有下面这些:
glog
gtest
leveldb
marisa-trie
opencc
yaml-cpp

你的坐标是哪里的,如果你在上海的话,我想当面请教。
typcn
2015-05-23 01:27:32 +08:00
直接丢进 XCode 项目,使用鼠标拖拽。。。。。。。。。。。。。。。。。。
typcn
2015-05-23 01:34:21 +08:00
非要手动编译也行,很简单,苹果提供了 [完整的工具链]

PATH=`xcodebuild -version -sdk iphoneos PlatformPath`"/Developer/usr/bin:$PATH"
SDK=`xcodebuild -version -sdk iphoneos Path`
CXX="xcrun --sdk iphoneos clang++ -arch $arch -miphoneos-version-min=7.0 --sysroot=$SDK -isystem $SDK/usr/include" LDFLAGS="-Wl,-syslibroot,$SDK"

多来几次,arch 分别为 armv7 armv7s arm64
如果要在模拟器用,iphoneos 改成 iphonesimulator ,arch 分别为 i386 x86_64
forkon
2015-05-23 15:50:18 +08:00
@typcn 兄台再多说一点呗,有没有例子可以看一下呢?

在github上找了个工具ios-cmake,跑起来报这样的错:

CMake Error at CMakeLists.txt:3 (project):
The CMAKE_CXX_COMPILER:

clang++

is not a full path and was not found in the PATH.

Tell CMake where to find the compiler by setting either the environment
variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
to the compiler, or to the compiler name if it is in the PATH.

你知道怎么解决吗
forkon
2015-05-23 19:31:06 +08:00
ios-cmake出现的Error: clang/clang++ is not a full path and was not found in the PATH.已经解决了

详见: https://github.com/ForDrink/ios-cmake/commit/385db495abd1a8fc32ab9597fb9a1306aacc3f3d

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

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

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

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

© 2021 V2EX