c++ linker g++ flags linker-flags

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 la option 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 de option=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 la option como una opción al vinculador. Si la option 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.