Closed hsav20 closed 4 years ago
你从哪看的文档和examples?我从来没写过提供了add_option_includedirs 这种接口,只有 add_includedirs, add_linkdirs,请仔细看下文档 https://xmake.io/#/zh-cn/manual/project_target?id=targetadd_includedirs
你能不能不要翻这么老的文章哈,还是15年的了,那个时候xmake才1.x版本哈,5年迭代过去了哈,我都快忘记了,1.x那个年代api不稳定,2.x开始重构后才稳定下来的。。
而且这里面提到的add_option_includedirs 是给 add_option 用的,不是给target用的。。
你就不能直接看官方文档么。。https://xmake.io
官方博客上的文章都比这个新:https://tboox.org/cn/category/
osc上的文章不怎么更新,尽量以官方文档站为主,这个肯定是及时最新的。。
之前在xmake.io打开的都是english版本的,就在网上试试找了,哈哈
之前在xmake.io打开的都是english版本的,就在网上试试找了,哈哈
你切到中文不就好了,en/zh版本都有啊。。中文更详细些。。
我刚才就是没有出来呢,另外,怎样加入外面的*.so ? libs\x86\lib\libavcodec.so
只使用下面可以吗? add_linkdirs("libs")
首先得确定xmake.lua所在目录,add_linkdirs都是相对于这个目录的路径
add_linkdirs("xxxxx libs\x86\lib") 前面的xxxx自己改下调整下相对路径。。如果在xmake.lua的上层目录的话。。 add_links("avcodec")
add_includedirs("libs/x86/include")
add_linkdirs("libs/x86/lib")
add_files("native-lib.cpp")
add_links("avutil");
add_links("avcodec");
add_links("avformat");
add_links("swscale");
add_links("swresample");
add_links("avfilter");
能找到libs/x86/include表示相对路径可以找到了 -LE:\Android\sdk\ndk\21.0.6113669\sources\cxx-stl\llvm-libc++/libs/arm64-v8a -lc++_static -lc++abi -nostdlib++ error: E:\Android\sdk\ndk\21.0.6113669\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: skipping incompatible libs\x86\lib/libavutil.so when searching for -lavutil E:\Android\sdk\ndk\21.0.6113669\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin\ld: cannot find -lavutil
但没有找到 avutil (libs/x86/lib/libavutil.so存在的,如果是libavutil.a 又是如何的)?
skipping incompatible libs\x86\lib/libavutil.so when searching for -lavutil
自己仔细看下错误提示,不兼容so,不是没找到,是找到了用不了。。你用arm64的编译器,提供的却是x86的libdir的so库,能用才怪了。。
如果是libavutil.a 又是如何的
用法一样。
对了,如何设置多个不同平台的库的?x86换其他以后呢?add_linkdirs("libs/x86/lib")
add_linkdirs("libs/$(arch)/lib")
自动根据arch -> x86, armeabi, armeabi-v7a ...切下目录
或者用
if is_arch("x86") then
add_linkdirs("libs/x86/lib")
elseif is_arch("armeabi") then
add_linkdirs("libs/armeabi/lib")
end
1、我整理了下文件夹后,在android视图下见不到xmake的编辑了 2、运行时少了其他so了 3、xmake可以直接编译ffmpeg吗,有没有相关的例子? TestC.zip
我又将ffmpeg编译为*.a库。运行提示04-27 18:04:12.433 15984-15984/ltd.hsav E/art: dlopen("/data/app/ltd.hsav-2/lib/x86/libnative-lib.so", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "ff_reverse" referenced by "libnative-lib.so"...
04-27 18:04:12.434 15984-15984/ltd.hsav E/AndroidRuntime: FATAL EXCEPTION: main
Process: ltd.hsav, PID: 15984
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "ff_reverse" referenced by "libnative-lib.so"...
at java.lang.Runtime.loadLibrary(Runtime.java:371)
at java.lang.System.loadLibrary(System.java:988)
at ltd.hsav.MainActivity.
提示的reverse我查过在 libavutil.a 之中的 reverse.o ff_reverse 链接为什么没有加入libavutil.a的内容? 另外,add_linkdirs("libs/$(arch)") 这样不行。只能用add_linkdirs("libs/x86")
一共做了两次, 第一次加入.so,提示少了一些so 第二次加入.a,提示dlopen("/data/app/ltd.hsav-2/lib/x86/libnative-lib.so", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "ff_reverse" referenced by "libnative-lib.so"...
到现在为止还不能使用
这里看不到xmake及c了
第一次加入*.so,提示少了一些so
xmake-gradle插件只能对自己生成的so自动copy到libs目录,第三方so目前需要自己手动放置到对应libs目录,否则不会打入包内
第二次加入*.a,提示dlopen("/data/app/ltd.hsav-2/lib/x86/libnative-lib.so", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "ff_reverse" referenced by "libnative-lib.so"...
ffmpeg各个库之前的links顺序也是有要求的,utils属于基础库,得最后links,你放置太靠前了,这种找不到符号的错误 跟xmake没啥关系,这种你自己调下吧。。
add_links("avfilter", "avdevice", "avformat", "avcodec", "swscale", "swresample", "avutil")
这里看不到xmake及c了
建议你先熟悉下androidstudio的使用,这个跟xmake也没任何关系。。你切到Android视图结构当然看不到文件了,只能看到class,可以自行google下。。只有project视图才能看到文件。
另外,add_linkdirs("libs/$(arch)") 这样不行。只能用add_linkdirs("libs/x86")
怎么个不行法,是x86库找不到,还是arm库找不,你得说清楚哪里不行,否则我没法知道是怎么回事,反正看你的配置
if is_arch("armeabi-v7a") then
add_linkdirs("../libs/armeabi-v7a")
elseif is_arch("arm64-v8a") then
add_linkdirs("../libs/arm64-v8a")
elseif is_arch("x86") then
add_linkdirs("libs/x86")
end
不同arch的so都不在相同目录结构层级下,当然切到Arm下就不行了。一会libs/
一会 ../libs/
。。通过$(arch)
当然没法自动切了
3、xmake可以直接编译ffmpeg吗,有没有相关的例子?
可以直接通过add_requires("ffmpeg")
集成ffmpeg库,不过目前仅支持 arm 的,不支持x86
add_requries("ffmpeg")
target("test")
-- ...
add_packages("ffmpeg")
不是的,原来有的,而且新建的cmake有的
不是的,原来有的,而且新建的cmake有的
人家是google官方在gradle中内置支持的cmake,当然androidstudio能识别到,xmake提供的插件仅仅只是跟gradle适配,不能跟androidstudio也完全适配。。
你切到Projects视图不就可以看到cpp和编辑了么。。
TestXmake.zip error: native-lib.cpp:7:14: fatal error: 'libavcodec/avcodec.h' file not found
^~~~~~~~~~~~~~~~~~~~~~
我重新按照google官方推荐的目录再做一次,发现找不到src/main/cpp/include下面的文件了
error: native-lib.cpp:7:14: fatal error: 'libavcodec/avcodec.h' file not found
include "libavcodec/avcodec.h"
^
~~~~~
首先,你得先确认下,add_includedirs() 有没有吧 libavcodec 所在的目录加进来。。
add_includedirs("src/main/cpp/include")
这个设置就不对,我之前说了,add_xxx这种接口设置,跟路径相关的,都是相对于xmake.lua所在目录的。。
add_includedirs("include")
但是,可以提示下或者出错吗?
但是,可以提示下或者出错吗?
目前提示不了,xmake只是透传includedirs给编译器而已,这个应该是编译器做的事,我记得编译器对未使用到include路径是有警告的
04-28 08:58:09.738 3945-3945/com.example.testxmake E/art: dlopen("/data/app/com.example.testxmake-1/lib/x86/libnative-lib.so", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "ubsan_handle_type_mismatch_v1" referenced by "libnative-lib.so"... 04-28 08:58:09.738 3945-3945/com.example.testxmake D/AndroidRuntime: Shutting down VM 04-28 08:58:09.738 3945-3945/com.example.testxmake E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.testxmake, PID: 3945 java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "ubsan_handle_type_mismatch_v1" referenced by "libnative-lib.so"...
提示的意思是你认为这个目录可能不对,或者没有内容,可以警告下,至于真实编译的结果由编译器处理
ffmpeg-4.2.2.zip 我上传编译ffmpeg4.2.2的脚本,./ffmpeg-4.2.2.sh v8a ./ffmpeg-4.2.2.sh v7a ./ffmpeg-4.2.2.sh x86使用的是clang,现在生成是*.a
提示的意思是你认为这个目录可能不对,或者没有内容,可以警告下,至于真实编译的结果由编译器处理
对于目录不存在的情况我可以尝试改进下,加个检测提示,对于目录空的情况,还需要评估下,因为这个需要open dir去遍历,有可能会有性能影响,如果影响大 我就暂时不加了。
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__ubsan_handle_type_mismatch_v1" referenced by "libnative-lib.so"...
这个只有开了 -fsanitize=undefined
编译才会出现的符号,xmake默认肯定不会去加这种的,请先确认ffmpeg库编译时候 是否启用了这个flags,出现这种符号,肯定是依赖的第三方库用到了带进来的。。
关于ubsan可以看下Clang的文档:https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
这个跟xmake也没任何关系
ffmpeg-4.2.2.zip 我上传编译ffmpeg4.2.2的脚本,./ffmpeg-4.2.2.sh v8a ./ffmpeg-4.2.2.sh v7a ./ffmpeg-4.2.2.sh x86使用的是clang,现在生成是*.a
--toolchain=clang-usan \
你用了带usan的clang当然会有这种问题,这块你自己研究下吧,这跟xmake没啥关系了,这边只处理跟xmake相关的问题。
使用clang除了 --toolchain=clang-usan 之外,还可以选择哪个?或者你在总编译时,加入同样的flag不就可以了吗?就是说一起加usan或一起不加usan
--toolchain=NAME set tool defaults according to NAME (gcc-asan, clang-asan, gcc-msan, clang-msan, gcc-tsan, clang-tsan, gcc-usan, clang-usan, valgrind-massif, valgrind-memcheck, msvc, icl, gcov, llvm-cov, hardened) 我们这里用应该选择哪个?
--toolchain=NAME set tool defaults according to NAME (gcc-asan, clang-asan, gcc-msan, clang-msan, gcc-tsan, clang-tsan, gcc-usan, clang-usan, valgrind-massif, valgrind-memcheck, msvc, icl, gcov, llvm-cov, hardened) 我们这里用应该选择哪个?
ffmpeg的编译脚本我不清楚,你自己google下吧
就是说一起加usan或一起不加usan
可以全部加上usan来解决,不过这样你整个库默认都跑在ubsan下了,性能多少会受影响,通常只有调试分析问题的时候,才会启用ubsan, asan这种检测,线上版本通常不会开这种。。
而且不同版本ndk对ubsan支持力度也不一样。。这个你自己评估吧,是否完全启用ubsan
提示的意思是你认为这个目录可能不对,或者没有内容,可以警告下,至于真实编译的结果由编译器处理
对于目录不存在的情况我可以尝试改进下,加个检测提示,对于目录空的情况,还需要评估下,因为这个需要open dir去遍历,有可能会有性能影响,如果影响大 我就暂时不加了。
这块后续在这里跟进进展,https://github.com/xmake-io/xmake/issues/771
AddressSanitizer (ASan) LeakSanitizer (LSan) ThreadSanitizer (TSan) UndefinedBehaviorSanitizer (UBSsan) MemorySanitizer (MSan)
应该有4种选择,我们xmake如何加入?
AddressSanitizer (ASan) LeakSanitizer (LSan) ThreadSanitizer (TSan) UndefinedBehaviorSanitizer (UBSsan) MemorySanitizer (MSan)
应该有4种选择,我们xmake如何加入?
add_rules("mode.asan", "mode.tsan", "mode.ubsan")
-- ...
然后gradle的 build.gradle配置里面追加 buildMode "ubsan",切到对应mode来编译
或者命令行切:
xmake f -m ubsan
xmake
如果不想用内置的构建modes,也可以自己通过 add_cxflags
, add_shflags
自己加对应的Clang san flags
Configure project : Repository https://jcenter.bintray.com/ replaced by http://maven.aliyun.com/nexus/content/groups/public. Repository https://jcenter.bintray.com/ replaced by http://maven.aliyun.com/nexus/content/groups/public.
Configure project :app [xmake/plugin]: activated for project: app
Task :app:xmakeConfigureForX86 FAILED
xmake f -y -v -p android -a x86 -m ubsan --ndk=E:\Android\sdk\ndk\21.0.6113669 --buildir=D:\ktv\TestXmake\app\build\xmake checking for the NDK directory ... E:\Android\sdk\ndk\21.0.6113669 checking for the SDK version of NDK ... 21 checking for the toolchains version of NDK ... 4.9 checking for the Android SDK directory ... E:\Android\sdk checking for the Build Tools Version of Android SDK ... 28.0.3 checking for the i686-linux-android-g++ ... no checking for the linker (ld: g++) ... no checking for the i686-linux-android-gcc ... no checking for the linker (ld: gcc) ... no checking for the clang++ ... E:\Android\sdk\ndk\21.0.6113669\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++ checking for the linker (ld) ... clang++ checking for the shared library linker (sh: g++) ... no checking for the shared library linker (sh: gcc) ... no checking for the shared library linker (sh) ... clang++ error: unknown rule(mode.asan) in target(native-lib)!
FAILURE: Build failed with an exception.
What went wrong: Execution failed for task ':app:xmakeConfigureForX86'.
exec failed( -1)
Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Get more help at https://help.gradle.org
BUILD FAILED in 2s 1 actionable task: 1 executed
提示的意思是你认为这个目录可能不对,或者没有内容,可以警告下,至于真实编译的结果由编译器处理
对于目录不存在的情况我可以尝试改进下,加个检测提示,对于目录空的情况,还需要评估下,因为这个需要open dir去遍历,有可能会有性能影响,如果影响大 我就暂时不加了。
这块后续在这里跟进进展,#771
https://github.com/xmake-io/xmake/issues/771#issuecomment-620366106
这个我稍微改进了下,更新xmake update dev试试,先加了路径不存在的检测
FAILURE: Build failed with an exception.
只有最新2.3.3版本才有 mode.asan mode.ubsan ..这种内置模式,你的应该是老版本
刚刚升级到2.3.3 结果一样 Executing tasks: [:app:assembleDebug] in project D:\ktv\TestXmake
Configure project : Repository https://jcenter.bintray.com/ replaced by http://maven.aliyun.com/nexus/content/groups/public. Repository https://jcenter.bintray.com/ replaced by http://maven.aliyun.com/nexus/content/groups/public.
Configure project :app [xmake/plugin]: activated for project: app
Task :app:xmakeConfigureForX86 FAILED
xmake f -y -v -p android -a x86 -m ubsan --ndk=E:\Android\sdk\ndk\21.0.6113669 --buildir=D:\ktv\TestXmake\app\build\xmake checking for the Android SDK directory ... E:\Android\sdk checking for the Build Tools Version of Android SDK ... 28.0.3 checking for the NDK directory ... E:\Android\sdk\ndk\21.0.6113669 checking for the SDK version of NDK ... 21 checking for the toolchains version of NDK ... 4.9 checking for the i686-linux-android-g++ ... no checking for the linker (ld: g++) ... no checking for the i686-linux-android-gcc ... no checking for the linker (ld: gcc) ... no checking for the clang++ ... E:\Android\sdk\ndk\21.0.6113669\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++ checking for the linker (ld) ... clang++ checking for the shared library linker (sh: g++) ... no checking for the shared library linker (sh: gcc) ... no checking for the shared library linker (sh) ... clang++ error: unknown rule(mode.msan) in target(native-lib)!
FAILURE: Build failed with an exception.
What went wrong: Execution failed for task ':app:xmakeConfigureForX86'.
exec failed( -1)
Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Get more help at https://help.gradle.org
BUILD FAILED in 1s 1 actionable task: 1 executed
error: unknown rule(mode.msan) in target(native-lib)!
看我刚给你贴的,我可没说支持了msan
add_rules("mode.asan", "mode.tsan", "mode.ubsan")
我dev上msan/lsan也加上了,不过这还得看编译器版本支持,反正我这的clang对msan/lsan都不支持,其实开了 也编译不过。ndk 20b的clang 我看也不支持。。
请问 xmake update dev 是怎样操作?我更新编译xmake.exe来使用吗?如果是,提供下xmake.exe的编译方法链接
add_rules("mode.debug", "mode.release") target("native-lib") set_kind("shared") add_option_includedirs("libs\x86\include") add_option_linkdirs("libs") add_files("native-lib.cpp")
(试过add_option_includedirs("libs/x86/include")也是一样)
.\xmake.lua:4: attempt to call global 'add_option_includedirs' (a nil value)