2012-02-17 19 views
8

Como sé, si quiero usar la biblioteca pthread en el entorno Linux, debo incluir pthread.h y compilar el código fuente con la opción -lpthread. Pero no entiendo por qué debería compilar con la opción -lpthread. Creo que la opción es redundante ... porque ya he declarado incluir el archivo de encabezado pthread.h para que gcc vincule la biblioteca pthread. ¿Por qué gcc no vincula automáticamente el archivo de la biblioteca pthread leyendo #include?-lpthread opción de gcc

Gracias de antemano.

+3

Relacionado: http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling, también debería usar '-pthread'. – Mat

Respuesta

17

Bien vinculando y compilación son dos fases separadas.

Incluye el encabezado pthread.h para que el compilador comprenda los tipos de datos & nombres de símbolo, que utiliza en sus archivos fuente pero que están definidos/declarados en el archivo de encabezado de biblioteca pthread.

Se vincula al pthread libray utilizando -lpthread para que el vinculador pueda encontrar esos símbolos en la biblioteca pthread durante la etapa de vinculación.

+1

Entonces, ¿por qué no tenemos que incluir alguna biblioteca explícitamente para vincular cuando usamos strcpy o printf? ¿Es porque todos están en la biblioteca estándar de C y eso está incluido por defecto, y todo lo que está fuera de esa biblioteca debe estar explícitamente vinculado? –

+0

@master_latch: sí, esa es la razón exacta. –

3

Porque GCC no hace auto-linking de bibliotecas activadas por la inclusión del encabezado (en lugar de MSVC, o eso me han dicho).

+1

Existe una opción '# pragma' para enlazar en una biblioteca en MSVC, pero se usa muy raramente (y generalmente se considera una mala práctica). –

2

El archivo de encabezado simplemente declara cuáles son las funciones pthread y cómo deben llamarse. -lpthread enlaces a la biblioteca misma, que contiene las funciones reales.

El compilador no tiene idea de cómo va a resolver las funciones en pthread.h. Es posible que desee utilizar una biblioteca estática, la proporcionada por el sistema, alguna implementación compatible, diablos, puede implementarlos usted mismo en otro archivo fuente. Depende del enlazador, y no concierne al compilador.

2

Tener #include <pthread.h> en su código no se vincula en la biblioteca; solo incluye el encabezado para la compilación. Eso le permite al compilador ver las diversas estructuras, declaraciones de funciones, etc. incluidas. Tener -lpthread hace que el enlazador haga el enlace. Entonces el include le dice al compilador lo que está disponible, y el -lpthread realmente permite que el programa llame a las funciones dentro de la biblioteca en tiempo de ejecución.

1

Al incluir los archivos de encabezado, le dice al compilador qué funciones va a ver. Pero si estas funciones están en una biblioteca externa, como las funciones pthread, necesita vincular esta biblioteca a su programa para que pueda acceder a esas funciones. Eso es lo que está haciendo -lpthread.

1
archivo de cabecera

pthread.h está incluido en el programa de hebras de POSIX, pero es necesario -lpthread durante la compilación, ya que la une con la biblioteca de pthread NOTA:-lpthread-lpcap todos son los interruptores con compilador gcc que pueden vincular particular, biblioteca en nuestro código fuente. (lpthread significa biblioteca "link pthread")

Cuestiones relacionadas