Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用windows交叉编译arm64-v8a项目的问题 #777

Closed
dsp2000 opened this issue May 10, 2020 · 112 comments
Closed

使用windows交叉编译arm64-v8a项目的问题 #777

dsp2000 opened this issue May 10, 2020 · 112 comments
Milestone

Comments

@dsp2000
Copy link

dsp2000 commented May 10, 2020

注:如果是问题报障或者特性请求,请选择对应issues模板,否则一律不回复。

描述问题详情

请在这描述你的问题详情。

使用xmake create -t shared -l c test生成一个新的项目,如何将这个项目修改为交叉编译arm64-v8a的?

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

在xmake.lua里面加入吗?
-target aarch64-none-linux-android

@waruqi
Copy link
Member

waruqi commented May 10, 2020

你都没说清楚交叉编译到哪个平台?android? 其他linux cross toolchain?

android的你看下文档 https://xmake.io/#/zh-cn/guide/configuration?id=android

其他交叉编译工具链见:https://xmake.io/#/zh-cn/guide/configuration?id=交叉编译

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

我需要用clang交叉编译到arm64平台,不是安卓的,但用安卓ndk自带的clang编译器

@waruqi
Copy link
Member

waruqi commented May 10, 2020

我需要用clang交叉编译到arm64平台,不是安卓的,但用安卓ndk自带的clang编译器

你都用了android ndk去编译arm64-v8a了,不就等于是编译android的库么,只不过你不是给android用而已

一样的用法,直接用 https://xmake.io/#/zh-cn/guide/configuration?id=android 里面说的方式就行了

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

我用xmake f -p android --ndk=D:\msys32\android-ndk-r20b/ -a x86 可以检测到编译器,但用

xmake f -p windows --ndk=D:\msys32\android-ndk-r20b/ -a x86 就不行,
我想用这个x86编译电脑可以运行的bin

如果不行,在不安装 Visual studio的情况下,有什么轻量级的编译器可以支持?clnag有吗?

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

我就是希望用xmake + clang编译所有平台的的库

@waruqi
Copy link
Member

waruqi commented May 10, 2020

xmake f -p windows --ndk=D:\msys32\android-ndk-r20b/ -a x86 就不行,
我想用这个x86编译电脑可以运行的bin

你既然用了ndk,就只能设置-p android平台,pc上x86你直接走vs不就好了,-p windows默认用的是vs的环境

如果不行,在不安装 Visual studio的情况下,有什么轻量级的编译器可以支持?clnag有吗?

可以用mingw,或者llvm clang都可以

@waruqi
Copy link
Member

waruqi commented May 10, 2020

我就是希望用xmake + clang编译所有平台的的库

那你就单独装llvm的工具链么

@waruqi
Copy link
Member

waruqi commented May 10, 2020

我就是希望用xmake + clang编译所有平台的的库

那你就单独装llvm的工具链么

不同平台还是要用不同的工具链的,就像ndk虽然提供各种arch,但是依赖runtime是针对android的,不同平台都是不同的

你用非ndk的工具链编译的so,即使arch对,android下也不一定跑的起来

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

UEMS3I 8PCBW3YSY8Q{VZ4V
target("arm64")

-- set kind
set_kind("static")

-- add files
add_files("src/interface.c")

-- add target
target("arm64_demo")

-- set kind
set_kind("binary")

-- add deps
add_deps("arm64")

-- add files
add_files("src/test.c")

上面生成libarm64.a 及 libarm64.so 两个文件,libarm64.a是不是只有interface.c的内容而没有test.c的内容的?

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

安装vs太费劲了,我只是需要生成dos可以运行的exe就可以了,主要是用来验证结果方便点而已。打算xmake + clang + vs code来实现,现在下载llvm之中

@waruqi
Copy link
Member

waruqi commented May 10, 2020

UEMS3I 8PCBW3YSY8Q{VZ4V
target("arm64")

-- set kind
set_kind("static")

-- add files
add_files("src/interface.c")

-- add target
target("arm64_demo")

-- set kind
set_kind("binary")

-- add deps
add_deps("arm64")

-- add files
add_files("src/test.c")

上面生成libarm64.a 及 libarm64.so 两个文件,libarm64.a是不是只有interface.c的内容而没有test.c的内容的?

是的

@waruqi
Copy link
Member

waruqi commented May 10, 2020

安装vs太费劲了,我只是需要生成dos可以运行的exe就可以了,主要是用来验证结果方便点而已。打算xmake + clang + vs code来实现,现在下载llvm之中

或者用tcc 轻量点

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

msvc编译很多现在的库比较多写法不支持的,例如64位的LL tcc应该也是很老的编译器,估计也不行

@waruqi
Copy link
Member

waruqi commented May 10, 2020

那就llvm clang好了

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

26WS0CYNO31ZFLSDXXTVH 9

xmake f -p windows --ndk=D:\Program Files\LLVM/

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

1PM1(Y}Z_`FV7ED6C)BGU66

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

xmake f -p windows --ndk=D:\Program Files\LLVM/ 不可以选择llvm吗?

@waruqi
Copy link
Member

waruqi commented May 10, 2020

ndk是给android平台用的,windows平台编译你传ndk干啥,xmake f -p windows --cc=xxx --cxx=xxx --ld=xxx

或者走cross平台 xmake f -p cross --sdk=xxx --cc=xx

你自己看下交叉编译文档吧 ,都有详细说明

https://xmake.io/#/zh-cn/guide/configuration?id=%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91

@waruqi
Copy link
Member

waruqi commented May 10, 2020

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

像llvm这些常用的也需要自己指cc这些找出来啊?

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

觉得也应该给你一个路径就可以了。我试试

@waruqi
Copy link
Member

waruqi commented May 10, 2020

像llvm这些常用的也需要自己指cc这些找出来啊?

我只是随手敲的,举个例子,看这里面的说明 根据自己的实际情况操作 我现在又没有llvm环境
https://tboox.org/cn/2019/12/05/quickstart-9-cross-compile/

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

我本来是认为llvm太常用了,xmake本来就支持的,像ndk这样就很好

@waruqi
Copy link
Member

waruqi commented May 10, 2020

我本来是认为llvm太常用了,xmake本来就支持的,像ndk这样就很好

所以我不是说根据 https://tboox.org/cn/2019/12/05/quickstart-9-cross-compile/ 这里面的说明一步步操作么,里面说了 默认只要设置--sdk=就能自动探测使用,不行再根据自己的实际情况一步步设置--cc=等其他参数

自己看下文章 稍微配置下就能用了

你先自己仔细看下文章和文档,llvm这种其他人稍微看下文档就能搞定,不用每次都要我给你打全配置命令的,我现在又没llvm环境

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

9RDIF)} EY83861E}KWY}MX
上面的我明白了,如何在vscode里面调用xmake?

@waruqi
Copy link
Member

waruqi commented May 10, 2020

装下xmake-vscode插件,你到插件中心搜下xmake

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

YHQO 58`3QUHY``F}5TH~KU
找了下,没有使用的例子,只有你的博客说明怎样制作vscode插件的
不知怎样用

@dsp2000
Copy link
Author

dsp2000 commented May 10, 2020

支持多相对路径这样吗?
add_includedirs("../, ../Inc, ../Src, ../

@waruqi
Copy link
Member

waruqi commented May 10, 2020

YHQO 58`3QUHY``F}5TH~KU
找了下,没有使用的例子,只有你的博客说明怎样制作vscode插件的
不知怎样用

这还需要使用说明哈,就下面一排button摸索两下就会了,所以我没写

你到https://github.com/xmake-io/xmake-vscode/blob/master/README.md 的readme里面看下几张gif图演示就行,基本上就是全部使用方式了

@waruqi
Copy link
Member

waruqi commented May 13, 2020

你更新下dev然后用 --toolchain=llvm这个参数 也只是llvm工具链 (因为这版本我会对交叉编译作比较大的重构,来更好的支持各种常用工具链,先定义好参数规范,以免后期再有改动。#780

xmake update -s dev
xmake f -p cross --sdk=/xxx/llvm --toolchain=llvm -c
xmake

@dsp2000
Copy link
Author

dsp2000 commented May 13, 2020

8MNBM$E}2YTF6X_FHG~NX
还是不行,我等你搞好再用吧

@dsp2000
Copy link
Author

dsp2000 commented May 15, 2020

{)5T04SA)Z~92J9XU96%83F
f.log

@waruqi
Copy link
Member

waruqi commented May 15, 2020

我这边没遇到这个问题,不行就根据自己的情况,追加 --cc=/xxx/clang的全路径就行了。。

@dsp2000
Copy link
Author

dsp2000 commented May 15, 2020

你没有用windows试过吧?

@waruqi
Copy link
Member

waruqi commented May 15, 2020

你没有用windows试过吧?

我就是win10下下的最新llvm测试的。

@waruqi
Copy link
Member

waruqi commented May 15, 2020

Snip20200515_2

@dsp2000
Copy link
Author

dsp2000 commented May 15, 2020

我这里有两台电脑,一台安装了vs的win7可以用的。另外一台刚好需要用clang的用不了

@dsp2000
Copy link
Author

dsp2000 commented May 15, 2020

configure
{
plat = cross
ccache = true
arch = none
bin = D:\Program Files\LLVM\bin
cc = D:\Program Files\LLVM\bin\clang
mode = release
ndk_stdcxx = true
host = windows
sdk = D:\Program Files\LLVM
clean = true
kind = static
buildir = build
ar = D:\Program Files\LLVM\bin\llvm-ar
toolchain = llvm
}
[ 5%]: compiling.release main.c
"D:\Program Files\LLVM\bin\clang" -c -fvisibility=hidden -O3 -Ibuild -I.. -I..\Inc -I..\Src -I..\Src\include -I..\libavcodec -I..\libavutil -I..\libavutil\arm -ID:\Library\kc3x "-ID:\Program Files\LLVM\include" -Qunused-arguments -o build.objs\WinDecM8c\cross\none\release.\main.c.o main.c

@dsp2000
Copy link
Author

dsp2000 commented May 15, 2020

现在是xmake 是每次都重新编译的吗?不是已经编译过的只链接?

@dsp2000
Copy link
Author

dsp2000 commented May 15, 2020

如果*.c出错没有做完,就会每次全部编译,否则只是链接。可能需要修正下。
另外target("WinM8c")这样在xmake+vs 是生成WinM8c.exe 在xmake+llvm生成WinM8c, 是问题吗?

@waruqi
Copy link
Member

waruqi commented May 15, 2020

如果*.c出错没有做完,就会每次全部编译,否则只是链接。可能需要修正下。

gcc vs clang目前xmake都支持头文件依赖处理和增量编译,不会每次重编,我刚测了下 确认不会重编

另外target("WinM8c")这样在xmake+vs 是生成WinM8c.exe 在xmake+llvm生成WinM8c, 是问题吗?

不是问题,不过可以改成.exe

@dsp2000
Copy link
Author

dsp2000 commented May 15, 2020

编译完成删除了中间文件吗?我需要找*.map文件,但没有

@waruqi
Copy link
Member

waruqi commented May 15, 2020

编译完成删除了中间文件吗?我需要找*.map文件,但没有

build/.deps里面,自己的格式,我会去去提取解析

@dsp2000
Copy link
Author

dsp2000 commented May 16, 2020

没有存在
D%A6)8TKKXCD{BM21QN{% E
_2CTO(8K1KRRS293%)5J9@M
TG_@Z(P4LXJOLK44XOHKGDS
F@K9K9{NZYVK}FQ`UQFV}Y1

N0OJS576Y2K{THMEIB7S9AU

@waruqi
Copy link
Member

waruqi commented May 16, 2020

这两个.d的不就是么,就是用来分析头文件依赖来实现增量编译的,.map默认不会生成

应该是xmake不会自动设置各种flags,除非用户自己在xmake.lua设置

如果是msvc 就自己通过add_ldflags设置/map 的flags,如果是 llvm/clang 你自己google下对应flags 通过add_ldflags加上就行了,或者用clang-cl

@dsp2000
Copy link
Author

dsp2000 commented May 17, 2020

configure
{
arch = none
ccache = true
mode = release
host = windows
clean = true
ndk_stdcxx = true
plat = cross
sdk = D:\Program Files\LLVM
bin = D:\Program Files\LLVM\bin
kind = static
buildir = build
ar = D:\Program Files\LLVM\bin\llvm-ar
toolchain = llvm
}
checking for the clang ... no
checking for the c compiler (cc: clang) ... no
checking for the c compiler (cc: clang) ... no

为什么在这台电脑出错?

@waruqi
Copy link
Member

waruqi commented May 17, 2020

不行 就先自己设置下 --cc=xxx/clang --cxx=xxx/clang 编译器全路径

@dsp2000
Copy link
Author

dsp2000 commented May 17, 2020

WS LNDYLUI7SQQUS{CRF

@waruqi
Copy link
Member

waruqi commented May 17, 2020

自己看下错误么 clang崩了,请先确保clang能在你这台pc上正常运行

@dsp2000
Copy link
Author

dsp2000 commented May 17, 2020

clang好像不能自己在windows安装使用的,需要vs或mingw?

@dsp2000
Copy link
Author

dsp2000 commented May 17, 2020

如果是这样,有什么编译器推荐下?

@waruqi
Copy link
Member

waruqi commented May 17, 2020

不知道 没试过 我这都是装了vs的 你可以提个issues给llvm问下

@dsp2000
Copy link
Author

dsp2000 commented May 17, 2020

安装vs算了

@waruqi
Copy link
Member

waruqi commented May 17, 2020

可以看下 https://www.zhihu.com/question/268562772 似乎还真没法完全不依赖vs,要么你装mingw好了

@waruqi
Copy link
Member

waruqi commented May 17, 2020

或者装intel的编译器 icc,这个应该可以完全独立,不过我还是好久之前用的了 xmake里面还没怎么支持 需要自己挨个设置--cc --cxx --ld 另外这个需要收费的 不过也有x版本 可以找找

@waruqi
Copy link
Member

waruqi commented May 17, 2020

除了这些 还有些比较冷门的,但也是完全独立的你可以看看,比如
bcc(borland c++ builder)
dmc https://digitalmars.com/ctg/sc.html
watcom什么的

@waruqi
Copy link
Member

waruqi commented May 17, 2020

或者可以看看这个 https://github.com/mstorsjo/llvm-mingw

@waruqi
Copy link
Member

waruqi commented May 26, 2020

如果*.c出错没有做完,就会每次全部编译,否则只是链接。可能需要修正下。

gcc vs clang目前xmake都支持头文件依赖处理和增量编译,不会每次重编,我刚测了下 确认不会重编

另外target("WinM8c")这样在xmake+vs 是生成WinM8c.exe 在xmake+llvm生成WinM8c, 是问题吗?

不是问题,不过可以改成.exe

我重构好了 详情可以看下 #780

现在工具链和平台做了分离,你可以直接在win平台使用llvm工具链,这样生成的文件后缀就会保持.exe .lib

xmake f --toochain=llvm --sdk=/xxx -c
xmake

不用特地切到cross平台,除非是交叉编译

可以通过xmake update dev更新到dev试试

@waruqi waruqi closed this as completed May 30, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants