La compilación de la biblioteca dinámica de Android encuentra el problema de generar una biblioteca de importación

pregunta

Cuando se usa scons para compilar la biblioteca dinámica de Android en Windows, se produce un error al vincular la biblioteca dinámica:

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: argumento desconocido '–out-implib'

Guión de Scons correspondiente:

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)

La penúltima oración "env.SharedLibrary()" es la clave para activar el comando de enlace y los parámetros relacionados.
Al vincular bibliotecas dinámicas de Android, no es necesario generar una biblioteca de importación como las bibliotecas dinámicas de Windows, por lo que no se aceptan los parámetros de línea de comando correspondientes "-Wl, --out-implib".

investigación

  1. Si reemplaza mingw en el parámetro Environment () en la cuarta línea del código con otro clangxx o similar, se informará un error:

AttributeError: el objeto 'SConsEnvironment' no tiene el atributo 'SharedLibrary'

Los efectos secundarios son enormes y es demasiado problemático cambiarlos.

  1. Verifique el código de Scons y confirme que el parámetro de línea de comando "-Wl,–out-implib" se agregue a la función shlib_generator () en \Python3\Lib\site-packages\SCons\Tool\mingw.py :
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))

No es recomendable modificar mingw.py directamente. Modificar LIBPREFIX o LIBSUFFIX no tendrá ningún efecto en los resultados.

  1. Accidentalmente descubrí este código en 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'):

Si desactiva la generación de bibliotecas de importación a través de no_import_lib, no habrá parámetros de línea de comando redundantes, ¿verdad?

Solución

Modifique el script de Scons:

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

Además, también puede agregar el parámetro de línea de comando scons "no_import_lib=yes" y usar la instrucción "opts.Update(env)" para configurar la función de la variable de entorno env para resolver este problema.

Supongo que te gusta

Origin blog.csdn.net/feiyunw/article/details/127524605
Recomendado
Clasificación