xmake-io / xmake

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

增加头目录及库目录提供出错 #769

Closed hsav20 closed 4 years ago

hsav20 commented 4 years ago

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)

waruqi commented 4 years ago

你从哪看的文档和examples?我从来没写过提供了add_option_includedirs 这种接口,只有 add_includedirs, add_linkdirs,请仔细看下文档 https://xmake.io/#/zh-cn/manual/project_target?id=targetadd_includedirs

hsav20 commented 4 years ago

https://my.oschina.net/tboox/blog/540178?p=1

waruqi commented 4 years ago

https://my.oschina.net/tboox/blog/540178?p=1

你能不能不要翻这么老的文章哈,还是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上的文章不怎么更新,尽量以官方文档站为主,这个肯定是及时最新的。。

hsav20 commented 4 years ago

之前在xmake.io打开的都是english版本的,就在网上试试找了,哈哈

waruqi commented 4 years ago

之前在xmake.io打开的都是english版本的,就在网上试试找了,哈哈

你切到中文不就好了,en/zh版本都有啊。。中文更详细些。。

hsav20 commented 4 years ago

我刚才就是没有出来呢,另外,怎样加入外面的*.so ? libs\x86\lib\libavcodec.so

只使用下面可以吗? add_linkdirs("libs")

waruqi commented 4 years ago

首先得确定xmake.lua所在目录,add_linkdirs都是相对于这个目录的路径

add_linkdirs("xxxxx libs\x86\lib") 前面的xxxx自己改下调整下相对路径。。如果在xmake.lua的上层目录的话。。 add_links("avcodec")

hsav20 commented 4 years ago
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 又是如何的)?

waruqi commented 4 years ago

skipping incompatible libs\x86\lib/libavutil.so when searching for -lavutil

自己仔细看下错误提示,不兼容so,不是没找到,是找到了用不了。。你用arm64的编译器,提供的却是x86的libdir的so库,能用才怪了。。

如果是libavutil.a 又是如何的

用法一样。

hsav20 commented 4 years ago

对了,如何设置多个不同平台的库的?x86换其他以后呢?add_linkdirs("libs/x86/lib")

waruqi commented 4 years ago
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
hsav20 commented 4 years ago

1、我整理了下文件夹后,在android视图下见不到xmake的编辑了 2、运行时少了其他so了 3、xmake可以直接编译ffmpeg吗,有没有相关的例子? TestC.zip

hsav20 commented 4 years ago

x86.zip

hsav20 commented 4 years ago

armeabi-v7a.zip arm64-v8a.zip

hsav20 commented 4 years ago

我又将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.(MainActivity.java:18) at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.Class.newInstance(Class.java:1606) at android.app.Instrumentation.newActivity(Instrumentation.java:1066) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

提示的reverse我查过在 libavutil.a 之中的 reverse.o ff_reverse 链接为什么没有加入libavutil.a的内容? 另外,add_linkdirs("libs/$(arch)") 这样不行。只能用add_linkdirs("libs/x86")

hsav20 commented 4 years ago

TestC.zip

hsav20 commented 4 years ago

lib_a_file.zip

hsav20 commented 4 years ago

libavcodec.zip

hsav20 commented 4 years ago

一共做了两次, 第一次加入.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"...

到现在为止还不能使用

hsav20 commented 4 years ago

(%$_QNWAC3_`~QSJ2W)K8BJ

这里看不到xmake及c了

waruqi commented 4 years ago

第一次加入*.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视图才能看到文件。

waruqi commented 4 years ago

另外,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)当然没法自动切了

waruqi commented 4 years ago

3、xmake可以直接编译ffmpeg吗,有没有相关的例子?

可以直接通过add_requires("ffmpeg")集成ffmpeg库,不过目前仅支持 arm 的,不支持x86

add_requries("ffmpeg")
target("test")
    -- ...
    add_packages("ffmpeg")
hsav20 commented 4 years ago

不是的,原来有的,而且新建的cmake有的 H7{AAXC0QU4TOCW {E}BP{N

waruqi commented 4 years ago

不是的,原来有的,而且新建的cmake有的

人家是google官方在gradle中内置支持的cmake,当然androidstudio能识别到,xmake提供的插件仅仅只是跟gradle适配,不能跟androidstudio也完全适配。。

你切到Projects视图不就可以看到cpp和编辑了么。。

hsav20 commented 4 years ago

TestXmake.zip error: native-lib.cpp:7:14: fatal error: 'libavcodec/avcodec.h' file not found

include "libavcodec/avcodec.h"

         ^~~~~~~~~~~~~~~~~~~~~~
hsav20 commented 4 years ago

我重新按照google官方推荐的目录再做一次,发现找不到src/main/cpp/include下面的文件了 8616{RSNXY9CW$P 06CDL02

waruqi commented 4 years ago

error: native-lib.cpp:7:14: fatal error: 'libavcodec/avcodec.h' file not found

include "libavcodec/avcodec.h"

^~~~~~

首先,你得先确认下,add_includedirs() 有没有吧 libavcodec 所在的目录加进来。。

waruqi commented 4 years ago
add_includedirs("src/main/cpp/include")

这个设置就不对,我之前说了,add_xxx这种接口设置,跟路径相关的,都是相对于xmake.lua所在目录的。。

add_includedirs("include")
hsav20 commented 4 years ago

但是,可以提示下或者出错吗?

waruqi commented 4 years ago

但是,可以提示下或者出错吗?

目前提示不了,xmake只是透传includedirs给编译器而已,这个应该是编译器做的事,我记得编译器对未使用到include路径是有警告的

hsav20 commented 4 years ago

DA9Z1FP1UBWR@FQXE$V6F7S 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"...

hsav20 commented 4 years ago

提示的意思是你认为这个目录可能不对,或者没有内容,可以警告下,至于真实编译的结果由编译器处理

hsav20 commented 4 years ago

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

waruqi commented 4 years ago

提示的意思是你认为这个目录可能不对,或者没有内容,可以警告下,至于真实编译的结果由编译器处理

对于目录不存在的情况我可以尝试改进下,加个检测提示,对于目录空的情况,还需要评估下,因为这个需要open dir去遍历,有可能会有性能影响,如果影响大 我就暂时不加了。

waruqi commented 4 years ago

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也没任何关系

waruqi commented 4 years ago

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相关的问题。

hsav20 commented 4 years ago

使用clang除了 --toolchain=clang-usan 之外,还可以选择哪个?或者你在总编译时,加入同样的flag不就可以了吗?就是说一起加usan或一起不加usan

hsav20 commented 4 years ago

--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) 我们这里用应该选择哪个?

waruqi commented 4 years ago

--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

waruqi commented 4 years ago

提示的意思是你认为这个目录可能不对,或者没有内容,可以警告下,至于真实编译的结果由编译器处理

对于目录不存在的情况我可以尝试改进下,加个检测提示,对于目录空的情况,还需要评估下,因为这个需要open dir去遍历,有可能会有性能影响,如果影响大 我就暂时不加了。

这块后续在这里跟进进展,https://github.com/xmake-io/xmake/issues/771

hsav20 commented 4 years ago

AddressSanitizer (ASan) LeakSanitizer (LSan) ThreadSanitizer (TSan) UndefinedBehaviorSanitizer (UBSsan) MemorySanitizer (MSan)

应该有4种选择,我们xmake如何加入?

waruqi commented 4 years ago

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

hsav20 commented 4 years ago

C1HS@ZR$9 4I S@PAGQO~X9 BGIH(L08L@E_UK7%A%BTS5D

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.

BUILD FAILED in 2s 1 actionable task: 1 executed

waruqi commented 4 years ago

提示的意思是你认为这个目录可能不对,或者没有内容,可以警告下,至于真实编译的结果由编译器处理

对于目录不存在的情况我可以尝试改进下,加个检测提示,对于目录空的情况,还需要评估下,因为这个需要open dir去遍历,有可能会有性能影响,如果影响大 我就暂时不加了。

这块后续在这里跟进进展,#771

https://github.com/xmake-io/xmake/issues/771#issuecomment-620366106

这个我稍微改进了下,更新xmake update dev试试,先加了路径不存在的检测

waruqi commented 4 years ago

FAILURE: Build failed with an exception.

只有最新2.3.3版本才有 mode.asan mode.ubsan ..这种内置模式,你的应该是老版本

hsav20 commented 4 years ago

刚刚升级到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.

BUILD FAILED in 1s 1 actionable task: 1 executed

waruqi commented 4 years ago

error: unknown rule(mode.msan) in target(native-lib)!

看我刚给你贴的,我可没说支持了msan

add_rules("mode.asan", "mode.tsan", "mode.ubsan")

waruqi commented 4 years ago

我dev上msan/lsan也加上了,不过这还得看编译器版本支持,反正我这的clang对msan/lsan都不支持,其实开了 也编译不过。ndk 20b的clang 我看也不支持。。

hsav20 commented 4 years ago

请问 xmake update dev 是怎样操作?我更新编译xmake.exe来使用吗?如果是,提供下xmake.exe的编译方法链接