2010-12-04 25 views
12

He creado OpenSSL desde el código fuente (una versión intencionalmente vieja, construida con ./config && make && make test) y preferiría usar lo que he construido sin hacer make install para enlazar con mi programa.Vinculación de librerías OpenSSL a un programa

El comando que está fallando es:

gcc -Wall -Wextra -Werror -static -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto 
-Iopenssl/openssl-0.9.8k/include -o myApp source1.o source2.o common.o` 

y recibo una serie de errores similares a:

common.c:(.text+0x1ea): undefined reference to `SSL_write' 

Esto me hace pensar que hay algo funky con mi OpenSSL. Si omito -Lopenssl/openssl-0.9.8k/ de mi mando, el error cambia a no poder:

/usr/bin/ld: cannot find -lssl 
/usr/bin/ld: cannot find -lcrypto 

¿Estoy recopilando OpenSSL incorrectamente? ¿O cómo debería resolver esto mejor?

Respuesta

23

Silly "Linux-isms" atacan de nuevo! Al parecer, tengo que cambiar mi orden tal que el material -L y -l es al final como (a pesar de lo que parece indicar man gcc):

gcc -Wall -Wextra -Werror -static -o myApp source1.o source2.o common.o -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto -Iopenssl/openssl-0.9.8k/include

+15

Es el '-lssl -lcrypto' que debe estar al final. Cuando el vinculador escanea una biblioteca, solo se vinculan las funciones para las que ya hay referencias no definidas. Por lo tanto, debe colocar los objetos "consumidores" al principio de la línea de enlace y los objetos "de suministro" al final. – caf

+1

Siempre soy raro acerca de aceptar mis propias respuestas. Sin embargo, lo cambiaré ahora. – mrduclaw

+0

¿Cómo se diferencia para clan llvm? – saruftw

4

¿Por qué no quieres usar make install? Puede copiar los binarios generados en el directorio que desea si pasados ​​previamente a ./configure --prefix $HOME/target_library_install_directory

Si ha utilizado este truco con cada biblioteca a construir e instalar, usted podría entonces añadir el directorio de destino para la variable de entorno LIBRARY_PATH y evitar el uso - L opción.

+0

Esto es bueno saberlo, pero no estoy seguro de que sea más fácil que simplemente moverme donde puse mi '-L'. Up-votado, sin embargo. – mrduclaw

+0

Voy a seguir adelante y aceptar esto como la respuesta, ya que es probablemente la forma correcta de hacerlo. En mi caso particular, no quería que todos los que comprobaban mi código (y el código OpenSSL modificado) tuvieran que hacer algo más que 'make'. – mrduclaw

1

Si usa Autotools, o está construyendo un proyecto de Autools como cURL, entonces debería poder usar pkg-config. La idea es que el paquete Autotools lea la configuración del paquete de OpenSSL y las cosas "solo funcionarán" para usted.

El nombre de la biblioteca de configuración del paquete OpenSSL es openssl.

Lo usaría como tal en un proyecto basado en el archivo MAKE.

%.o: %.c 
     $(CC) -o [email protected] -c `pkg-config --cflags openssl` $^ 

target: foo.o bar.o baz.o 
     $(CC) -o [email protected] `pkg-config --libs openssl` $^ 

Véase también How to use pkg-config in Make y How to use pkg-config to link a library statically.

+0

gracias por esta respuesta sobre 'pkg-config'. ¿Puedes explicarme como si tuviera cinco años, qué es 'pkg-config' y cómo funciona exactamente? cómo se logró que automáticamente encuentre todos los enlaces para incluir directorios, etc. Por supuesto que podría usarlo como magia, pero es genial saber cómo funciona internamente. – barney

Cuestiones relacionadas