xmake-io / xmake

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

设置工具链为clang遇到的问题 #576

Closed owllyi closed 4 years ago

owllyi commented 4 years ago

使用命令行配置: xmake f -v --cc=clang --cxx=clang++ --ld=clang++ -m debug 可以正确保存工具链为clang,正确编译代码

但是我希望能在xmake.lua里直接设置工具链,不用再执行配置指令,这么写的: set_tools("cc", "/usr/bin/clang") set_tools("cxx", "/usr/bin/clang++") set_tools("ld", "/usr/bin/clang++")

add_rules("mode.debug", "mode.release")

-- add target target("hello") -- 之前set_tools放在这里,也不能生效

-- set kind
set_kind("binary")

-- add files
add_files("src/*.cpp") 

直接执行xmake,会默认使用gcc编译,clang++来链接。为什么不是使用clang++编译呢?

请问是不是我设置错了,要如何设置才能在不用调用xmake f配置的情况下,直接可以编译呢?

输出结果: checking for the architecture ... x86_64 configure { plat = linux arch = x86_64 ccache = true kind = static buildir = build host = linux mode = release ndk_stdcxx = true } checking for the gcc ... /usr/bin/gcc checking for the c++ compiler (cxx) ... gcc checking for the /usr/bin/gcc ... ok checking for the flags (-O3) ... ok checking for the ccache ... no [ 0%]: compiling.release src/main.cpp /usr/bin/gcc -c -fvisibility=hidden -O3 -m64 -I/usr/local/include -I/usr/include -o build/.objs/hello/linux/x86_64/release/src/main.cpp.o src/main.cpp checking for the flags (-MMD -MF) ... ok [100%]: linking.release hello clang++ -o build/linux/x86_64/release/hello build/.objs/hello/linux/x86_64/release/src/main.cpp.o -s -fvisibility=hidden -m64 -L/usr/local/lib -L/usr/lib

waruqi commented 4 years ago

set_tools这个接口目前设计上是操作整个tools dictionary,所以最后一次set_tools会覆盖之前的整个tools,因为它支持同时设置多个tools,所以你这里最后一个ld的设置,覆盖了之前的Tools设置

set_tools {
    cc = path.join(os.projectdir(), "tools/bin/clang-5.0"),
    mm = path.join(os.projectdir(), "tools/bin/clang-5.0"),
}

因此你这边应该是用add_tools。

你可以详细看下文档:https://xmake.io/#/manual/project_target?id=set-toolchains

关于这块,set_tools设计上确实很容易导致误解,回头我改进下,通过加个 set_toolchain 接口,来更好的处理单个 tool 的设置。。

目前你还是先用add_tools吧,或者使用set_config("cxx", "clang") 也是可以的。。

set_config和set_tools的区别就是,set_config是全局应用默认xmake f 的配置值,全局对所有target生效,而set_tools/add_tools可以对每个Target分别设置不同的值,更加灵活。

waruqi commented 4 years ago

我dev分支上已经加了set_toolchain设置,来逐步代替比较有歧义的set_tools/add_tools,提供更加易理解的方式来设置。你可以更新下试试:xmake update -s dev

set_toolchain("cxx", "clang")
set_toolchain("ld", "clang++")

之前的set_tools/add_tools还是会保留向下兼容几个大版本,文档等发版后我会更新下。。

owllyi commented 4 years ago

感谢支持,我后来实验出来add_tools可以生效,此问题已经解决了。

还有一个问题,我发现xmake生成的so比cmake生成的大了1MB,对比了一下,猜测是自动加上了:-lc++_static -lc++abi 导致的,请问这两个库在哪里设置,可以去掉链接呢,我再测试下so能否变小。

waruqi commented 4 years ago

xmake内部应该没加过这两,你贴下完整编译命令给我看下呢?执行 xmake -v

要么是clang++作为linker自动加的

owllyi commented 4 years ago

[100%]: linking.release libMyLib.so F:\Android\android-sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang -o build\android\armv7-a\release\libMyLib.so build\.objs\MyLib\android\armv7-a\release\AFile\OBBFILEWrapper.cpp.o build\.objs\MyLib\android\armv7-a\release\ACommon\ALog.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\MyLib_Android.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\BackupPackageHelper.cpp.o build\.objs\MyLib\android\armv7-a\release\Utility\mysscanf.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AWIniFile.cpp.o build\.objs\MyLib\android\armv7-a\release\ACommon\AList.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AScriptFile.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\clPathFile.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\7zIn.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AIniFile.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\logger.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AWScriptFile.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\PackDLL.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\ADirImage.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\clFile.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\VersionMan.cpp.o build\.objs\MyLib\android\armv7-a\release\ACommon\AMemory.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\Base64forPatcher.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AFI.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\clBuffer.cpp.o build\.objs\MyLib\android\armv7-a\release\PathFinder\initdatapool.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Xz.cpp.o build\.objs\MyLib\android\armv7-a\release\Utility\UnityLog.cpp.o build\.objs\MyLib\android\armv7-a\release\PathFinder\PathFinde_map.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Bcj2.cpp.o build\.objs\MyLib\android\armv7-a\release\PathFinder\astar.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\XzIn.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\clstd.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\XzDec.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\XzCrc64.cpp.o build\.objs\MyLib\android\armv7-a\release\.\AngelicaExport.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\ATextTabFile.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Sha256.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Ppmd7Enc.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Ppmd7Dec.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Ppmd7.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\DataPoolBuildTime.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\smartstream.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\LzmaLib.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\LzmaEnc.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\LzmaDec.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Lzma86Dec.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\casemap.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\DataPool.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AFilePackage.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Lzma2Dec.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\LzFind.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Delta.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\CpuArch.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\BraIA64.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Bra86.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Bra.cpp.o build\.objs\MyLib\android\armv7-a\release\PathFinder\PathFinderExport.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\Alloc.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AMemFile.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\7zStream.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\7zFile.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\7zDec.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\ADiskFile.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\7zCrc.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\7zBuf2.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\DataPoolImpl.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\7zBuf.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\7zAlloc.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\utility.cpp.o build\.objs\MyLib\android\armv7-a\release\ACommon\AString.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\patcher.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zDecode\7zCrcOpt.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AFileUnicode.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\GameDataPool.cpp.o build\.objs\MyLib\android\armv7-a\release\ACommon\AWString.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\DataPoolVariable.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AFileImage.cpp.o build\.objs\MyLib\android\armv7-a\release\ACommon\AAssist.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AFile.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\AssetFILEWrapper.cpp.o build\.objs\MyLib\android\armv7-a\release\ACommon\ASysThread.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\DataPoolCompiler.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\Launcher.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\clString.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\clAllocator.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\DataPoolIterator.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\ecvt.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\UnityAssetFILEWrapper.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\ADir.cpp.o build\.objs\MyLib\android\armv7-a\release\DataPool\SmartStock.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\md5base.cpp.o build\.objs\MyLib\android\armv7-a\release\Patcher\7zReader.cpp.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\uncompr.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\inffast.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\inflate.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\zutil.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\compress.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\crc32.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\trees.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\infcodes.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\infutil.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\gzio.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\infblock.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\deflate.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\inftrees.c.o build\.objs\MyLib\android\armv7-a\release\AFile\ZLib\adler32.c.o -llog -landroid -shared -fPIC -mthumb -target armv7-none-linux-androideabi -gcc-toolchain F:\Android\android-sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64 --sysroot=F:\Android\android-sdk\ndk-bundle\platforms\android-29/arch-arm -LF:\Android\android-sdk\ndk-bundle\sources\cxx-stl\llvm-libc++/libs/armeabi-v7a -lc++_static -lc++abi

最后一句

owllyi commented 4 years ago

build D$:/Android/patcher/app/build/intermediates/cmake/release/obj/armeabi-v7a/libMyLib.so: CXX_SHARED_LIBRARY_LINKER__MyLib MyLib/ACommon/AAssist.cpp.o MyLib/ACommon/AList.cpp.o MyLib/ACommon/ALog.cpp.o MyLib/ACommon/AMemory.cpp.o MyLib/ACommon/AString.cpp.o MyLib/ACommon/ASysThread.cpp.o MyLib/ACommon/AWString.cpp.o MyLib/AFile/ZLib/adler32.c.o MyLib/AFile/ZLib/compress.c.o MyLib/AFile/ZLib/crc32.c.o MyLib/AFile/ZLib/deflate.c.o MyLib/AFile/ZLib/gzio.c.o MyLib/AFile/ZLib/infblock.c.o MyLib/AFile/ZLib/infcodes.c.o MyLib/AFile/ZLib/inffast.c.o MyLib/AFile/ZLib/inflate.c.o MyLib/AFile/ZLib/inftrees.c.o MyLib/AFile/ZLib/infutil.c.o MyLib/AFile/ZLib/trees.c.o MyLib/AFile/ZLib/uncompr.c.o MyLib/AFile/ZLib/zutil.c.o MyLib/AFile/ADir.cpp.o MyLib/AFile/ADirImage.cpp.o MyLib/AFile/ADiskFile.cpp.o MyLib/AFile/AFI.cpp.o MyLib/AFile/AFile.cpp.o MyLib/AFile/AFileImage.cpp.o MyLib/AFile/AFilePackage.cpp.o MyLib/AFile/AFileUnicode.cpp.o MyLib/AFile/AIniFile.cpp.o MyLib/AFile/AMemFile.cpp.o MyLib/AFile/MyLib_Android.cpp.o MyLib/AFile/AScriptFile.cpp.o MyLib/AFile/AssetFILEWrapper.cpp.o MyLib/AFile/ATextTabFile.cpp.o MyLib/AFile/AWIniFile.cpp.o MyLib/AFile/AWScriptFile.cpp.o MyLib/AFile/OBBFILEWrapper.cpp.o MyLib/AFile/UnityAssetFILEWrapper.cpp.o MyLib/DataPool/casemap.cpp.o MyLib/DataPool/clAllocator.cpp.o MyLib/DataPool/clBuffer.cpp.o MyLib/DataPool/clFile.cpp.o MyLib/DataPool/clPathFile.cpp.o MyLib/DataPool/clstd.cpp.o MyLib/DataPool/clString.cpp.o MyLib/DataPool/DataPool.cpp.o MyLib/DataPool/DataPoolBuildTime.cpp.o MyLib/DataPool/DataPoolCompiler.cpp.o MyLib/DataPool/DataPoolImpl.cpp.o MyLib/DataPool/DataPoolIterator.cpp.o MyLib/DataPool/DataPoolVariable.cpp.o MyLib/DataPool/ecvt.cpp.o MyLib/DataPool/GameDataPool.cpp.o MyLib/DataPool/SmartStock.cpp.o MyLib/DataPool/smartstream.cpp.o MyLib/Patcher/7zDecode/7zAlloc.cpp.o MyLib/Patcher/7zDecode/7zBuf.cpp.o MyLib/Patcher/7zDecode/7zBuf2.cpp.o MyLib/Patcher/7zDecode/7zCrc.cpp.o MyLib/Patcher/7zDecode/7zCrcOpt.cpp.o MyLib/Patcher/7zDecode/7zDec.cpp.o MyLib/Patcher/7zDecode/7zFile.cpp.o MyLib/Patcher/7zDecode/7zIn.cpp.o MyLib/Patcher/7zDecode/7zStream.cpp.o MyLib/Patcher/7zDecode/Alloc.cpp.o MyLib/Patcher/7zDecode/Bcj2.cpp.o MyLib/Patcher/7zDecode/Bra.cpp.o MyLib/Patcher/7zDecode/Bra86.cpp.o MyLib/Patcher/7zDecode/BraIA64.cpp.o MyLib/Patcher/7zDecode/CpuArch.cpp.o MyLib/Patcher/7zDecode/Delta.cpp.o MyLib/Patcher/7zDecode/LzFind.cpp.o MyLib/Patcher/7zDecode/Lzma2Dec.cpp.o MyLib/Patcher/7zDecode/Lzma86Dec.cpp.o MyLib/Patcher/7zDecode/LzmaDec.cpp.o MyLib/Patcher/7zDecode/LzmaEnc.cpp.o MyLib/Patcher/7zDecode/LzmaLib.cpp.o MyLib/Patcher/7zDecode/Ppmd7.cpp.o MyLib/Patcher/7zDecode/Ppmd7Dec.cpp.o MyLib/Patcher/7zDecode/Ppmd7Enc.cpp.o MyLib/Patcher/7zDecode/Sha256.cpp.o MyLib/Patcher/7zDecode/Xz.cpp.o MyLib/Patcher/7zDecode/XzCrc64.cpp.o MyLib/Patcher/7zDecode/XzDec.cpp.o MyLib/Patcher/7zDecode/XzIn.cpp.o MyLib/Patcher/7zReader.cpp.o MyLib/Patcher/BackupPackageHelper.cpp.o MyLib/Patcher/Base64forPatcher.cpp.o MyLib/Patcher/Launcher.cpp.o MyLib/Patcher/logger.cpp.o MyLib/Patcher/md5base.cpp.o MyLib/Patcher/PackDLL.cpp.o MyLib/Patcher/patcher.cpp.o MyLib/Patcher/utility.cpp.o MyLib/Patcher/VersionMan.cpp.o MyLib/PathFinder/astar.cpp.o MyLib/PathFinder/initdatapool.cpp.o MyLib/PathFinder/PathFinde_map.cpp.o MyLib/PathFinder/PathFinderExport.cpp.o MyLib/Utility/mysscanf.cpp.o MyLib/Utility/psnwprintf.c.o MyLib/Utility/UnityLog.cpp.o MyLib/MyLibExport.cpp.o | F$:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi/16/liblog.so F$:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi/16/libandroid.so LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -Oz -DNDEBUG -O3 -s LINK_FLAGS = -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack LINK_LIBRARIES = -llog -landroid -latomic -lm OBJECT_DIR = CMakeFiles\MyLib.dir POST_BUILD = cd . PRE_LINK = cd . SONAME = libMyLib.so SONAME_FLAG = -Wl,-soname, TARGET_FILE = D:\WORK\OUTLIVED_EngineSVN\Android\patcher\app\build\intermediates\cmake\release\obj\armeabi-v7a\libMyLib.so TARGET_PDB = MyLib.so.dbg RSP_FILE = CMakeFiles/MyLib.rsp

这个是cmake生成的ninja工程,编译出来的so为1MB,xmake编译出来的2MB,不知道多出来的是哪部分,能否帮忙看下呢?非常感谢

owllyi commented 4 years ago

对比了一下,应该是cmake默认是用的是libstdc++库,xmake默认使用libc++库。 还没找到方法怎么设置能让xmake使用libstdc++。

add_ldflags("-static-libstdc++")
add_syslinks("atomic","m")

这样也没生效。google的文档中说是需要设置 ANDROID_STL 为 gnustl_static。还没试验成功。

waruqi commented 4 years ago

可以通过 xmake f -p android --ndk_cxxstl=gnustl_static

来切换其他stl ,你可以敲 xmake f --help看下参数说明

waruqi commented 4 years ago

另外cmake 编译我看设置了 -Oz等最小优化编译,所以会很小

你看下xmake.lua里面 release模式启用了没有

add_rules("mode.release", "mode.debug")

设置了xmake内置的release模式编译 这些优化flags也会默认加上

owllyi commented 4 years ago

收到,我加上add_rules("mode.release", "mode.debug")试试看。我自己加了优化的设置可以删除了吧:add_cxflags("-O3","-s")

xmake f -p android --ndk_cxxstl=gnustl_static 这个我设置一下看看

waruqi commented 4 years ago

恩 这些都不需要加 即使加 也应该用 set_optimize("smallest") 尽量不要用cxflags直接加 这样不同编译器需要不同处理

owllyi commented 4 years ago

xmake f -p android --ndk_cxxstl=gnustl_static 使用了这个,编译失败了。估计是头文件目录设置问题。

add_rules("mode.release", "mode.debug") 加上这句之后,so就已经变成1MB大小了。 应该是比自己设置-O3 -s加了更多的优化,裁剪了so尺寸,还没研究明白差异哪里,我再看看。

非常感谢支持,我先把so放到apk里看下运行效果如何。

waruqi commented 4 years ago

xmake f -p android --ndk_cxxstl=gnustl_static 使用了这个,编译失败了。估计是头文件目录设置问题。

这个只是我随手敲的 你还得设置ndk 目录 并且得确保当前ndk版本里面提供了gnu stl,高版本ndk里面应该没有了 只有 llvm c++ stl

owllyi commented 4 years ago

感谢感谢,帮了大忙。xmake真的很好用。只是我刚接触,还不太熟悉。

so已经编好了,加载的时候报错:has unexpected e_machine: 40 我正在研究是哪里配置错了。

waruqi commented 4 years ago

so/device arch没对上吧。。

owllyi commented 4 years ago

查各种资料是这么说,但是我打印elf信息,看起来都挺正常的,还没找到具体原因。 用cmake编译出来的so就可以运行。同样都是armv7-a平台。

ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: ARM Version: 0x1 Entry point address: 0x0 Start of program headers: 52 (bytes into file) Start of section headers: 1042636 (bytes into file) Flags: 0x5000200, Version5 EABI, soft-float ABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 8 Size of section headers: 40 (bytes) Number of section headers: 27 Section header string table index: 26

Dynamic section at offset 0xf941c contains 31 entries: Tag Type Name/Value 0x00000003 (PLTGOT) 0xfa870 0x00000002 (PLTRELSZ) 12040 (bytes) 0x00000017 (JMPREL) 0x4cc64 0x00000014 (PLTREL) REL 0x00000011 (REL) 0x4882c 0x00000012 (RELSZ) 17464 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffa (RELCOUNT) 986 0x00000006 (SYMTAB) 0x1cc 0x0000000b (SYMENT) 16 (bytes) 0x00000005 (STRTAB) 0xd9fc 0x0000000a (STRSZ) 186512 (bytes) 0x6ffffef5 (GNU_HASH) 0x3b28c 0x00000004 (HASH) 0x416a0 0x00000001 (NEEDED) Shared library: [liblog.so] 0x00000001 (NEEDED) Shared library: [libandroid.so] 0x00000001 (NEEDED) Shared library: [libm.so] 0x00000001 (NEEDED) Shared library: [libdl.so] 0x00000001 (NEEDED) Shared library: [libc.so] 0x0000001a (FINI_ARRAY) 0xf85f0 0x0000001c (FINI_ARRAYSZ) 8 (bytes) 0x00000019 (INIT_ARRAY) 0xfa404 0x0000001b (INIT_ARRAYSZ) 24 (bytes) 0x0000001e (FLAGS) BIND_NOW 0x6ffffffb (FLAGS_1) Flags: NOW 0x6ffffff0 (VERSYM) 0x46cc8 0x6ffffffc (VERDEF) 0x487d0 0x6ffffffd (VERDEFNUM) 1 0x6ffffffe (VERNEED) 0x487ec 0x6fffffff (VERNEEDNUM) 2 0x00000000 (NULL) 0x0

owllyi commented 4 years ago

这是cmake编译出来的,我看起来唯一的区别是少了一个SONAME。不过cmake出来的,总感觉是用的libstdc++,还在看生成的ninja文件。

ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: ARM Version: 0x1 Entry point address: 0x0 Start of program headers: 52 (bytes into file) Start of section headers: 1067236 (bytes into file) Flags: 0x5000200, Version5 EABI, soft-float ABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 8 Size of section headers: 40 (bytes) Number of section headers: 28 Section header string table index: 27

Dynamic section at offset 0xff4b4 contains 32 entries: Tag Type Name/Value 0x00000003 (PLTGOT) 0x100910 0x00000002 (PLTRELSZ) 11720 (bytes) 0x00000017 (JMPREL) 0x4c0fc 0x00000014 (PLTREL) REL 0x00000011 (REL) 0x47c44 0x00000012 (RELSZ) 17592 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffa (RELCOUNT) 1004 0x00000006 (SYMTAB) 0x1f0 0x0000000b (SYMENT) 16 (bytes) 0x00000005 (STRTAB) 0xd6c0 0x0000000a (STRSZ) 184752 (bytes) 0x6ffffef5 (GNU_HASH) 0x3a870 0x00000004 (HASH) 0x40bdc 0x00000001 (NEEDED) Shared library: [liblog.so] 0x00000001 (NEEDED) Shared library: [libandroid.so] 0x00000001 (NEEDED) Shared library: [libm.so] 0x00000001 (NEEDED) Shared library: [libdl.so] 0x00000001 (NEEDED) Shared library: [libc.so] 0x0000000e (SONAME) Library soname: [libMyLib.so] 0x0000001a (FINI_ARRAY) 0xfe640 0x0000001c (FINI_ARRAYSZ) 8 (bytes) 0x00000019 (INIT_ARRAY) 0x10049c 0x0000001b (INIT_ARRAYSZ) 24 (bytes) 0x0000001e (FLAGS) BIND_NOW 0x6ffffffb (FLAGS_1) Flags: NOW 0x6ffffff0 (VERSYM) 0x4612c 0x6ffffffc (VERDEF) 0x47bc8 0x6ffffffd (VERDEFNUM) 1 0x6ffffffe (VERNEED) 0x47be4 0x6fffffff (VERNEEDNUM) 3 0x00000000 (NULL) 0x0

waruqi commented 4 years ago

你可以diff下两边的编译参数,和链接参数

owllyi commented 4 years ago

先尝试增加SONAME字段,lua里添加了这个选项,没有生效。 add_ldflags("-Wl,-soname,libMyLib.so")

xmake -f 增加了 --ldflags=-Wl,-soname,libMyLib.so --shflags=-Wl,-soname,libMyLib.so --cxxflags=-Wl,-soname,libMyLib.so 也没有生效,最终生成so,没有这个参数。求大大帮忙看下,如何解决呢。

owllyi commented 4 years ago

cmake生成的ninjia代码是这样的: clang++.exe --target=armv7-none-linux-androideabi16 --gcc-toolchain=F:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=F:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in 使用的flags: FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -Oz -DNDEBUG -O3 -s -fPIC -D _ANDROID -D _ARM -D GXDLL_API_INDEPENDENT

其中明确指出了: --target=armv7-none-linux-androideabi16 -march=armv7-a -std=c++11


xmake生成的编译命令是这样的: clang++ -c -Wl,-soname,libMyLib.so -O3 -I. -I3rdsdk -I3rdsdk\\utf8 -IACommon -IAFile -IAFile\\ZLib -IDataPool -IDataPool\\include -IPatcher -IPatcher\\7zDecode -IPathFinder -IUtility -D_ANDROID -D_ARM -DGXDLL_API_INDEPENDENT --sysroot=F:\Android\android-sdk\ndk-bundle\sysroot -isystem F:\Android\android-sdk\ndk-bundle\sysroot\usr\include\arm-linux-androideabi -IF:\Android\android-sdk\ndk-bundle\sources\cxx-stl\llvm-libc++/include -IF:\Android\android-sdk\ndk-bundle\sources\cxx-stl\llvm-libc++/libs/armeabi-v7a/include -IF:\Android\android-sdk\ndk-bundle\sources\cxx-stl\llvm-libc++abi\include -Qunused-arguments -mthumb -target armv7-none-linux-androideabi -gcc-toolchain F:\Android\android-sdk\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64 -D__ANDROID_API__=23 -fPIC -o build\.objs\MyLib\android\armv7-a\release\Patcher\7zReader.cpp.o Patcher\7zReader.cpp

只有: -target armv7-none-linux-androideabi 不是androideabi16 没有出现 -march=armv7-a -std=c++11 这两个参数。不知道是否有影响?

waruqi commented 4 years ago

先尝试增加SONAME字段,lua里添加了这个选项,没有生效。 add_ldflags("-Wl,-soname,libMyLib.so")

xmake -f 增加了 --ldflags=-Wl,-soname,libMyLib.so --shflags=-Wl,-soname,libMyLib.so --cxxflags=-Wl,-soname,libMyLib.so 也没有生效,最终生成so,没有这个参数。求大大帮忙看下,如何解决呢。

这根soname应该没啥关系的。。目前加原生ldflags会有自动尝试编译链接检测的,检测不过,就会自动忽略这个Flags,你可以通过 add_ldflags("-Wl,-soname,libMyLib.so", {force = true})强制加上,如果自动检测不准的话。。

waruqi commented 4 years ago

只有: -target armv7-none-linux-androideabi 不是androideabi16 没有出现 -march=armv7-a -std=c++11

跟stdc++没啥关系,你可以手动复制xmake的完整link 命令。。然后里面改成 -target armv7-none-linux-androideabi16 ,然后手动执行link后,测试验证下so是否可用,如果可用,那应该是 androideabi16 的设置问题。。如果还是不可用,可以再修改其他flags,比如 -march=armv7-a 什么,一步步往cmake的命令上对齐,看看到底哪个flags影响了。。

owllyi commented 4 years ago

各种参数都靠上去了,还是不行。有点头疼。

看了下,这里还有区别: cmake参数: -DANDROID_PLATFORM=android-16 -DCMAKE_SYSTEM_VERSION=16

set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "F:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/lib64/clang/8.0.7/lib/linux/arm;F:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb;F:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/arm-linux-androideabi/lib/armv7-a/thumb;F:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi/16;F:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/arm-linux-androideabi;F:/Android/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib")

这个平台16怎么设置呢,是--ndk_sdkver=16么,设置之后各种编译错误。

owllyi commented 4 years ago

没找到gradle的这几个参数在哪里设置: compileSdkVersion 28 buildToolsVersion "29.0.2" minSdkVersion 16 targetSdkVersion 28

waruqi commented 4 years ago

compileSdkVersion 28 buildToolsVersion "29.0.2" minSdkVersion 16 targetSdkVersion 28

这些大部分都是java编译才需要的设置。ndk下编译,只需要设置一个 --ndk_sdkver=xx

--build_toolver=可用于修改buildToolsVersion,不过这个仅在部署apk的时候需要,通常也不用设置

这个平台16怎么设置呢,是--ndk_sdkver=16么,设置之后各种编译错误。

就是 --ndk_sdkver=16 这么配置的,不过一般默认就行了,改不改都没关系,只是影响依赖的一些系统库版本而已。。改成16报错,可以贴下错误,你可以确认下 当前ndk有没有提供platform-16,不过即使改了,也跟你当前的问题 没啥必然关系。。

我觉得还是arch的问题。。可以参考 cmake也改成--target=armv7-none-linux-androideabi16试下。。修改方式 我之前说了。。

你可以手动复制xmake的完整link 命令。。然后里面改成 -target armv7-none-linux-androideabi16 ,然后手动执行link后,测试验证下so是否可用,如果可用,那应该是 androideabi16 的设置问题

owllyi commented 4 years ago

--target=armv7-none-linux-androideabi16 这个已经添加了,没有效果。还是报错。

waruqi commented 4 years ago

那就再把其他跟cmake有差异的flags也加上 再试试

owllyi commented 4 years ago

-target armv7-none-linux-androideabi xmake默认生成加了一句这个,是否和--target=armv7-none-linux-androideabi16冲突呢,能否通过配置去掉呢?

不过我手工删除了-target armv7-none-linux-androideabi,执行链接,还是报错。实在是找不到问题在哪了。。。头大。。。

waruqi commented 4 years ago

你把编译的库发我看下看下呢

owllyi commented 4 years ago

大大,能否加个QQ或者微信呢,我直接把两边的配置文件发给你看下,可否

owllyi commented 4 years ago

或者我发到你gmail邮箱吧

waruqi commented 4 years ago

直接发邮箱吧。。我回头看下。。

waruqi commented 4 years ago

如果可以的话,你可以做个可以复现的 demo 工程,发我下。。我这边复现调试下。。

owllyi commented 4 years ago

已发送gmail,附件里包含so,还有测试的apk

owllyi commented 4 years ago

用逍遥安卓6.5的模拟器运行,就会报错。

waruqi commented 4 years ago

我这边的手机用xmake/TestAAR.apk安装运行正常么,logcat里面也并没有看到有类似错误。。我觉得这个应该是模拟器问题吧,真机我没遇到错误

owllyi commented 4 years ago

但是cmake编出来的so,模拟器里就能正常运行。比较奇怪。 如果正常运行的话,会打印一句dpc:0,你看下logcat里有没有。

waruqi commented 4 years ago

但是cmake编出来的so,模拟器里就能正常运行。比较奇怪。 如果正常运行的话,会打印一句dpc:0,你看下logcat里有没有。

有打印,也能正常看到渲染的图形。

owllyi commented 4 years ago

渲染图形和这个调用无关,调用成功会打印dpc:0,调用失败,直接就java抛异常了。

主要是不明白,为何我自己编的so在模拟器运行失败。用Android Studio的cmake的工程就能在模拟器正常运行,都是arm7的so。

owllyi commented 4 years ago

想解决模拟器的兼容性问题,so调用失败的话,模拟器玩家就丢失了。

waruqi commented 4 years ago

确实很奇怪,我看编译上应该没啥问题,真机也ok,模拟器我看只有exe的,我这边mac没环境安装测试。

owllyi commented 4 years ago

D/houdini (19000): [19024] Load library /data/app/com.dw.testaar-1/lib/arm/libMyLib.so failed. E/art (19000): dlopen("/data/app/com.dw.testaar-1/lib/arm/libMyLib.so", RTLD_LAZY) failed: dlopen failed: "/data/app/com.dw.testaar-1/lib/arm/libMyLib.so" has unexpected e_machine: 40 这个是模拟器的报错,好像是houdini转移库,没有正确识别这个so,认为arch不对。 我现在在手机上也能运行,但是在模拟器运行失败。感觉还是哪里有个编译问题,让houdini识别错误了。

waruqi commented 4 years ago

http://cn.voidcc.com/question/p-xbmpcjbd-qq.html 这里有个类似的错误,houdini 是x86的模拟器?

owllyi commented 4 years ago

求大大抽空再研究下,希望能用xmake取代cmake,脱离AS IDE编译so

owllyi commented 4 years ago

嗯,模拟器里的一个库,能把ARM指令翻译成x86的指令。

这些文章我都看过了,没什么头绪,不知道修改什么地方能检查通过。

owllyi commented 4 years ago

会不会29的库太新,houdini不能正确识别呢?

waruqi commented 4 years ago

会不会29的库太新,houdini不能正确识别呢?

也有可能的,还有link的std c++库版本。也有可能会影响,见:https://github.com/facebook/react-native/issues/12246#issuecomment-340950292

waruqi commented 4 years ago

可以尝试std c++库 以及 androud ndk version 改成跟cmake的一致 试试,可能这个模拟器android环境比较老。xmake默认编译出来的版本太高。导致so库在低版本环境下有兼容问题 跑不起来

owllyi commented 4 years ago
add_cxflags("--target=armv7-none-linux-androideabi16",{force=true})
add_cxflags("-DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -march=armv7-a -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -Oz -DNDEBUG  -O3 -s -fPIC   -D _ANDROID -D _ARM -D GXDLL_API_INDEPENDENT",{force=true})
add_cxxflags("-std=c++11",{force=true})

add_shflags("-Wl,-soname,libAngelicaMobile.so",{force=true})
add_shflags("--target=armv7-none-linux-androideabi16",{force=true})
add_shflags("-Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack",{force=true})

xmake.lua里,已经尽可能的把所有的flag都设置了。但是xmake会默认生成一些标签,不知道怎么去掉。比如:-target armv7-none-linux-androideabi

现在感觉差异最大的就是平台16还是29了,引用的stl,和a应该不同。

arm64引用的是21平台,这个是第一个支持64位的:ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/21

waruqi commented 4 years ago

xmake f -p android --ndk_sdkver=16 --ndk_cxxstl=gnustl_static 改成这个试试呢。。-target armv7-none-linux-androideabi 这个不动 应该也没关系的。。头文件和库目录 会自动切到16的版本。。

/usr/local/bin/ccache /Users/ruki/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -c -fvisibility=hidden -O3 -fPIE -pie --sysroot=/Users/ruki/Library/Android/sdk/ndk-bundle/sysroot -isystem /Users/ruki/Library/Android/sdk/ndk-bundle/sysroot/usr/include/arm-linux-androideabi -Qunused-arguments -mthumb -target armv7-none-linux-androideabi -gcc-toolchain /Users/ruki/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 -D__ANDROID_API__=16 -o build/.objs/test/android/armv7-a/release/src/main.c.o src/main.c
checking for the flags (-MMD -MF) ... ok
[100%]: linking.release test
/Users/ruki/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -o build/android/armv7-a/release/test build/.objs/test/android/armv7-a/release/src/main.c.o -s -fvisibility=hidden -llog -mthumb -target armv7-none-linux-androideabi -gcc-toolchain /Users/ruki/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/ruki/Library/Android/sdk/ndk-bundle/platforms/android-16/arch-arm -fPIE -pie -L/Users/ruki/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a -lgnustl_static