¿Cómo compilar el archivo .c con OpenSSL incluye?

6 minutos de lectura

avatar de usuario
jahmax

Estoy tratando de compilar un pequeño archivo .c que incluye lo siguiente:

#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/x509.h>
#include <openssl/evp.h>

En la misma carpeta donde tengo el archivo .c tengo un /openssl con todos esos archivos (y más), también en el administrador de paquetes synaptic veo instalado OpenSSL, estoy tratando de compilar con esto:

gcc -o Opentest Opentest.c -lcrypto

pero siempre obtengo los errores:

error: openssl/ssl.h: No such file or directory
error: openssl/rsa.h: No such file or directory
error: openssl/x509.h: No such file or directory
error: openssl/evp.h: No such file or directory

El archivo que quiero compilar es solo un archivo .c, no tiene Makefile ni ./configure.

Ya probé:

env CFLAGS=-I/path/to/openssl/

e intenté compilar de nuevo pero obtengo los mismos errores.

¿Qué debo hacer para compilar con OpenSSL incluidos?

  • Consulte también ¿Cómo compilar openssl con rpath relativo y Build OpenSSL with RPATH? Garantiza que obtenga las bibliotecas esperadas en tiempo de ejecución.

    – jww

    14/09/2018 a las 20:14

avatar de usuario
coste y flete

Sus rutas de inclusión indican que debe compilar contra el del sistema Instalación OpenSSL. no deberías tener el .h archivos en el directorio de su paquete; debería recogerlos de /usr/include/openssl.

El paquete simple de OpenSSL (libssl) no incluye el .h archivos: también debe instalar el paquete de desarrollo. esto se llama libssl-dev en Debian, Ubuntu y distribuciones similares, y libssl-devel en CentOS, Fedora, Red Hat y similares.

  • @jahmax: No te preocupes. Encontrará que la mayoría de los paquetes de biblioteca en las distribuciones basadas en Debian tienen un *-dev paquete que necesitará compilar contra la biblioteca (y a menudo un *-dbg paquete que contiene símbolos de depuración para la biblioteca).

    – café

    30 de julio de 2010 a las 23:40

  • Tocar el asunto exacto. libssl-dev hizo el truco para construir osslsigncode-1.5.2 en Ubuntu.

    – karmakaze

    20 de junio de 2013 a las 2:15

  • Cómo instalar libssl-dev en wondows7?

    – Wafeeq

    19 mayo 2017 a las 13:24

  • @Wafeeq simplemente copie su comentario y péguelo en un motor de búsqueda.

    – emc

    13 de junio de 2019 a las 19:23

  • Aparentemente falta params.h en /usr/include/openssl/ después de seguir estos pasos

    –Reeshabh Ranjan

    29 de marzo de 2020 a las 12:18


Utilizar el -I marca a gcc correctamente.

gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c

los -I debe apuntar al directorio que contiene el openssl carpeta.

  • gcc -I/home/username/Programming/openssl/ -o Opentest -lcrypto Opentest.c me da los mismos errores 🙁

    – jahmax

    30 de julio de 2010 a las 4:29

  • Para elaborar su respuesta si la carpeta openssl es /path/to/openssl/ entonces la opción debe ser -I/path/to/ @jahmax. Entonces quieres /home/username/Programming/

    – Condez

    30 de julio de 2010 a las 4:36


  • @Earlz: Gracias, traté de decir eso con la última línea explícita, pero debe haberse perdido.

    – Boréalida

    30 de julio de 2010 a las 4:42

  • Gracias, funcionó, pero ahora recibo errores en las inclusiones dentro de openssl/ssl.h, que incluyen archivos que están dentro de /openssl/subcarpetas, ¿cómo puedo hacer que gcc los encuentre?

    – jahmax

    30 de julio de 2010 a las 4:51


  • @jah si está siendo “malo” y la ruta de inclusión de su propio proyecto (openssl/*) no coincide con OpenSSL (posible *) entonces usted podría tener este problema. La mejor solución es cambiar su proyecto para usar ssl.h en lugar de openssl/ssl.h etc. La solución rápida es establecer rutas de inclusión para ambos /path/to/ y /path/to/openssl/

    – Condez

    30 de julio de 2010 a las 4:58

avatar de usuario
usuario2317002

Use el fragmento a continuación como una solución para el desafío citado;

yum install openssl
yum install openssl-devel

Probado y demostrado su eficacia en CentOS versión 5.4 con la versión 1.2.7 de keepalived.

Debe incluir la ruta de la biblioteca (-L/usr/local/lib/)

gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto

Esto funciona para mi.

Si los encabezados de OpenSSL están en el openssl subdirectorio del directorio actual, utilice:

gcc -I. -o Opentest Opentest.c -lcrypto

El preprocesador busca crear un nombre como “./openssl/ssl.h” desde el “.” en el -I opción y el nombre especificado entre paréntesis angulares. Si hubiera especificado los nombres entre comillas dobles (#include "openssl/ssl.h"), es posible que nunca haya necesitado hacer la pregunta; el compilador en Unix generalmente busca automáticamente los encabezados entre comillas dobles en el directorio actual, pero no lo hace para los encabezados entre corchetes angulares (#include <openssl/ssl.h>). Es un comportamiento definido por la implementación.

No dice dónde están las bibliotecas OpenSSL; es posible que deba agregar una opción y un argumento apropiados para especificar eso, como ‘-L /opt/openssl/lib‘.

  • Intenté -L/usr/lib pero sigo recibiendo errores en todos los incluidos de ssl.h, ¿por qué gcc no puede encontrarlos?

    – jahmax

    30 de julio de 2010 a las 14:50

avatar de usuario
Praveen S

Desde el archivo openssl.pc

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries and tools
Version: 0.9.8g
Requires:
Libs: -L${libdir} -lssl -lcrypto
Libs.private: -ldl -Wl,-Bsymbolic-functions -lz
Cflags: -I${includedir}

Puede anotar la ruta del directorio de inclusión y la ruta de las bibliotecas a partir de aquí. Ahora su prefijo para los archivos de inclusión es /home/username/Programming . Por lo tanto, su opción de archivo de inclusión debe ser -I//home/username/Programming.

(Sí, lo entendí de los comentarios de arriba)

Esto es solo para eliminar registros relacionados con los encabezados. También puede proporcionar -L<Lib path> opción de enlace con el -lcrypto Biblioteca.

  • Intenté -L/usr/lib pero sigo recibiendo errores en todos los incluidos de ssl.h, ¿por qué gcc no puede encontrarlos?

    – jahmax

    30 de julio de 2010 a las 14:50

Para este error de gcc, debe hacer referencia a la documento gcc sobre ruta de búsqueda.

En breve:

1) Si usa corchetes angulares (<>) con #include, gcc buscará el archivo de encabezado primero desde la ruta del sistema, como /usr/local/incluir y /usr/incluiretc

2) La ruta especificada por -Ldirectorio opción de línea de comandos, se buscará antes que los directorios predeterminados.

3) Si usa comillas (“”) con #include como #include “archivo”, primero se buscará en el directorio que contiene el archivo actual.

entonces, la respuesta a tu pregunta es la siguiente:

1) Si desea utilizar archivos de encabezado en su carpeta de código fuente, reemplace <> con “” en la directiva #include.

2) si desea usar la opción de línea de comando -I, agréguela a su línea de comando de compilación (si configura CFLAGS en las variables de entorno, no se hará referencia automáticamente)

3) Acerca de la configuración del paquete (openssl.pc), no creo que se haga referencia a él sin declararlo explícitamente en la configuración de compilación.

  • -ldir Está Mal. con -les siempre lib en lugar de dir.

    – Wafeeq

    19 de mayo de 2017 a las 11:49

  • @GulluButt Debería ser -Ldir. He revisado mi respuesta.

    – gzh

    19 de mayo de 2017 a las 12:16

  • Tengo un problema similar que se menciona en esta pregunta. Estoy tratando de compilar un ejemplo del enlace a continuación, pero no funciona. No estoy seguro si mi instalación está bien o no. Cuando yo digo -lsslbusca ssl.dll en el directorio de instalación de openssl ? codificación simple.blogspot.de/2010/08/…

    – Wafeeq

    19 mayo 2017 a las 13:20


  • @GulluButt, para Linux, la opción -lssl hará que gcc busque libssl.so o libssl.a para los símbolos necesarios.

    – gzh

    22 de mayo de 2017 a las 0:56

  • en Windows no en Linux.

    – Wafeeq

    22 de mayo de 2017 a las 8:39

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad