c++ - Cómo permitir-z multidefs con g++ 47
linker flags (2)
¿Cómo puedo decirle al enlazador de g++
que permita múltiples definiciones de símbolos (elija la primera aparición)?
-z multidefs Permite múltiples definiciones de símbolos. De forma predeterminada, las definiciones de símbolos múltiples que se producen entre objetos reubicables (archivos .o) provocarán una condición de error fatal. Esta opción suprime la condición de error y permite que se tome la primera definición de símbolo. Esta opción solo es válida cuando se especifica la opción -b svr4.
La opción -zmuldefs
no es reconocida por g++
, ni -z OPTION
. ¿Cuál es el parámetro correcto? ¿Es posible?
GCC usa ld
como enlazador en linux, que es parte de binutils
creados por GNU.
Parece que la versión más nueva de ld
no es compatible -z muldefs
opción -z muldefs
. Puede intentar usar --allow-multiple-definitions
como alternativa.
No existe el "enlazador de g ++", utiliza el propio enlazador de su sistema.
Para pasar opciones desde GCC al vinculador, debe usar las -Wl,
de GCC -Wl,
o -Xlinker
:
-Xlinker option
Pase laoption
como una opción al vinculador. Puede usar esto para proporcionar opciones de vinculador específicas del sistema que GCC no sabe cómo reconocer.
Si desea pasar una opción que toma un argumento por separado, debe usar-Xlinker
dos veces, una para la opción y otra para el argumento. Por ejemplo, para pasar-assert definitions
, debe escribir-Xlinker -assert -Xlinker definitions
. No funciona escribir-Xlinker "-assert definitions"
, porque esto pasa toda la cadena como un único argumento, que no es lo que el vinculador espera.
Cuando se usa el enlazador GNU, generalmente es más conveniente pasar argumentos a las opciones del enlazador usando la sintaxis deoption=value
que como argumentos separados. Por ejemplo, puede especificar-Xlinker -Map=output.map
lugar de-Xlinker -Map -Xlinker output.map
. Es posible que otros vinculadores no admitan esta sintaxis para las opciones de línea de comandos.
-Wl,option
Pase laoption
como una opción al vinculador. Si laoption
contiene comas, se divide en múltiples opciones en las comas. Puede usar esta sintaxis para pasar un argumento a la opción. Por ejemplo,-Wl,-Map,output.map
pasa-Map output.map
al enlazador. Cuando usa el enlazador GNU, también puede obtener el mismo efecto con-Wl,-Map=output.map
.
Entonces querrías usar
-Xlinker -z -Xlinker multidefs
o
-Wl,-z,multidefs
pero los documentos que citó dicen que también debe usar -b svr4
para usar esa opción, por ejemplo
-Wl,-b,svr4,-z,multidefs
Editar: De sus comentarios veo que está en Mac OS X, que usa el enlazador darwin, y su página man muestra que la opción correspondiente está obsoleta:
-m
No trate múltiples definiciones como un error. Esto ya no es compatible. Esta opción es obsoleta.