xmake-io / xmake

🔥 A cross-platform build utility based on Lua
https://xmake.io
Apache License 2.0
10.08k stars 784 forks source link

交叉编译链中cxx能否改为只保留g++, clang++,或者g++,clang++优先 #1950

Closed fasiondog closed 2 years ago

fasiondog commented 2 years ago

在使用交叉编译时,如果有依赖其他源码包时,对依赖的源码包总是使用 gcc 去编译,导致某些情况下,最终二进制文件链接失败。

如示例的hello工程,加入sqlite3依赖(注:这个示例可以正常编译链接) add_rules("mode.debug", "mode.release") add_requires("sqlite3") target("hello") set_kind("binary") add_packages("sqlite3") add_files("src/*.cpp")

使用下面的配置命令: xmake f -c \ -p cross --sdk=/home/ubuntu/soft/toolchain_v83x_linux_x86/toolchain-sunxi-musl/toolchain \ --cxx=/home/ubuntu/soft/toolchain_v83x_linux_x86/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-g++ \ --cc=/home/ubuntu/soft/toolchain_v83x_linux_x86/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-g++ \ -a armv7-a \ -y -vD \ -k shared

编译依赖的sqlite3时总是优先使用gcc。 图片

这样导致依赖包使用gcc,而项目本身使用g++,在某些涉及线程局部变量时,导致项目链接失败。

建议 toolchains\cross\load.lua中的下面这句 toolchain:add("toolset", "cxx", cross .. "gcc", cross .. "clang", cross .. "g++", cross .. "clang++")

改为: toolchain:add("toolset", "cxx", cross .. "g++", cross .. "clang++", cross .. "gcc", cross .. "clang")

C++ 的还是C++的编译器优先

fasiondog commented 2 years ago

另外,自定义的交叉编译链可以平滑的传到使用cmake编译的源码依赖包,但没法都穿到xmake的

waruqi commented 2 years ago

在使用交叉编译时,如果有依赖其他源码包时,对依赖的源码包总是使用 gcc 去编译,导致某些情况下,最终二进制文件链接失败。

所以,干嘛要去改成 g++ 呢,代码编译走 gcc 完全可以,没必要去切。

另外,自定义的交叉编译链可以平滑的传到使用cmake编译的源码依赖包,但没法都穿到xmake的

自定义 toolchain ,你得放到全局 ~/xmakerc.lua 里面去定义,因为透传给 xmake 是透传的 toolchain 名,但是 toolchain 定义 在子包 xmake.lua 是没定义的,因为你只在自己项目里面定义了它,找不到,你只有定义到全局才能找到。。

而你这里 --cc 没生效,是 tools.xmake 里面目前没透传用户的 --cc 参数导致,我刚加上去了,再试下

而 cmake/autoconf, 是透传的 cc/ld 没走 toolchain 整个透传,好处是能直接传过去,坏处是没法完整透传 自定义 toolchain 的所有东西和状态还有环境。。

fasiondog commented 2 years ago

多谢,我明天试下

waruqi commented 2 years ago

我dev改进过了,自定义toolchain也可以直接透传,不需要 xmakerc

https://github.com/xmake-io/xmake/pull/2045