sublime reconoce para lenguaje interno externo con compile compilar como comando c++ c g++ linker

c++ - reconoce - mingw sublime text 3



g++ vinculación de la dependencia de orden al vincular el código c con el código c++ (4)

El orden en que se especifican los archivos de objeto y las bibliotecas es MUY importante en GCC, si no te ha mordido antes de que tengas una vida encantadora. El vinculador busca símbolos en el orden en que aparecen, por lo que si tiene un archivo fuente que contiene una llamada a una función de biblioteca, debe colocarlo antes de la biblioteca o el vinculador no sabrá que tiene que resolverlo. El uso complejo de las bibliotecas puede significar que tiene que especificar la biblioteca más de una vez, lo cual es un verdadero problema para hacer las cosas bien.

Antes de hoy, siempre creí que el orden en que los objetos y las bibliotecas pasaban a g ++ durante la etapa de vinculación no era importante. Entonces, hoy, traté de vincular desde código c ++ a código c. Envolví todos los encabezados C en un bloque "C" externo pero el enlazador aún tenía dificultades para encontrar símbolos que yo sabía que estaban en los archivos del objeto C.

Perplejo, creé un ejemplo relativamente simple para aislar el error de enlace, pero para mi sorpresa, el ejemplo más simple se vinculó sin ningún problema.

Después de un poco de prueba y error, descubrí que al emular el patrón de vinculación utilizado en el ejemplo simple, podía obtener el código principal para vincular OK. El patrón fue el código del objeto primero, el segundo archivo del objeto, por ejemplo:

g++ -o serverCpp serverCpp.o algoC.o libcrypto.a

¿Alguien puede arrojar algo de luz sobre por qué esto podría ser así ?. Nunca he visto este problema al vincular el código ordinario de C ++.


La orden de la biblioteca pasar a gcc / g ++ realmente importa. Si A depende de B , A debe aparecer primero. La razón es que optimiza los símbolos a los que no se hace referencia, de modo que si ve la biblioteca B primero, y nadie la ha referenciado en ese punto, entonces no vinculará nada en absoluto.


Puede usar --archivos de grupos de inicio --end-group y escribir las 2 bibliotecas dependientes en lugar de los archivos

gcc main.o -L. -Wl, - grupo de inicio -lobj_A -lobj_b -Wl, - grupo de finalización


Una biblioteca estática es una colección de archivos de objetos agrupados en un archivo. Al vincularse con él, el vinculador solo elige los objetos que necesita para resolver cualquier símbolo actualmente indefinido. Como los objetos están vinculados en orden dado en la línea de comando, los objetos de la biblioteca solo se incluirán si la biblioteca aparece después de todos los objetos que dependen de ella.

Entonces el orden del enlace es muy importante; si va a utilizar bibliotecas estáticas, debe tener cuidado de realizar un seguimiento de las dependencias y no introducir dependencias cíclicas entre las bibliotecas.