编译 Android 动态库遇到生成导入库的问题

9 篇文章 0 订阅
8 篇文章 1 订阅

问题

在Windows上使用scons编译Android动态库时,在链接动态库时报错:

D:\android\android-sdk\ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++ --target=aarch64-linux-android21 -march=armv8-a -shared -o src\android\ddsnative.so … -Wl,–out-implib,src\android\libddsnative.a
=====
ld: error: unknown argument ‘–out-implib’

对应Scons脚本:

if env["platform"] == "android":
    if host_platform == "windows":
        # Don't Clone the environment. Because otherwise, SCons will pick up msvc stuff.
        env = Environment(ENV=os.environ, tools=["mingw"])
        opts.Update(env)
...
library = None
library = env.SharedLibrary(target=env["target_path"] + "/" + env["platform"] + "/" + env["target_name"], source=sources)
Default(library)

倒数第二句“env.SharedLibrary()”是触发链接命令及相关参数的关键。
链接Android动态库时不需要象Windows动态库那样生成一个导入库,因此也不接受相应的命令行参数“-Wl,–out-implib”。

调查

  1. 如果将代码第四行Environment()参数中的mingw换成其它clangxx之类,会报错:

AttributeError: ‘SConsEnvironment’ object has no attribute ‘SharedLibrary’

副作用很大,改起来太麻烦。

  1. 检查Scons代码,确认是在\Python3\Lib\site-packages\SCons\Tool\mingw.py中的shlib_generator()函数添加了”-Wl,–out-implib“命令行参数:
def shlib_generator(target, source, env, for_signature):
...
    implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
    if implib: cmd.append('-Wl,--out-implib,' + implib.get_string(for_signature))

直接改mingw.py不可取,修改LIBPREFIX或LIBSUFFIX对结果也没有影响。

  1. 偶然发现mingw.py中有这段代码:
def shlib_emitter(target, source, env):
    dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
    no_import_lib = env.get('no_import_lib', 0)
...
    if not no_import_lib and \
            not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):

如果通过no_import_lib禁止生成导入库,就不会有多余的命令行参数了吧?

解决办法

修改Scons脚本:

	env = Environment(ENV=os.environ, tools=["mingw"])
+	env["no_import_lib"] = True
	opts.Update(env)

另外,也可以添加scons命令行参数“no_import_lib=yes”,利用“opts.Update(env)”语句设置env环境变量的功能来解决这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值