No se puede vincular el código OpenSSL

Estoy tratando de construir un programa simple de openssl. Aquí está el código completo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "openssl/aes.h"

int main(int argc, char* argv[])
{
    AES_KEY aesKey_;
    unsigned char userKey_[16];
    unsigned char in_[16];
    unsigned char out_[16];
    strcpy(userKey_,"0123456789123456");
    strcpy(in_,"0123456789123456");

    fprintf(stdout,"Original message: %s", in_);
    AES_set_encrypt_key(userKey_, 128, &aesKey_);
    AES_encrypt(in_, out_, &aesKey_);

    AES_set_decrypt_key(userKey_, 128, &aesKey_);
    AES_decrypt(out_, in_,&aesKey_);
    fprintf(stdout,"Recovered Original message: %s", in_);      
    return 0;
}

Intento compilarlo usando este comando:

gcc -I/home/aleksei/openSSL0.9.8/include -o app -L . -lssl -lcrypto tema1.c

y me sale esto:

 /tmp/ccT1XMid.o: In function `main':
 tema1.c:(.text+0x8d): undefined reference to `AES_set_encrypt_key'
 tema1.c:(.text+0xa7): undefined reference to `AES_encrypt'
 tema1.c:(.text+0xbf): undefined reference to `AES_set_decrypt_key'
 tema1.c:(.text+0xd9): undefined reference to `AES_decrypt'
 collect2: ld returned 1 exit status

Estoy bajo Ubuntu 10.04. ¿Cómo puedo hacer que esto funcione?

preguntado el 12 de junio de 12 a las 21:06

El error le dice que el enlazador no puede encontrar la definición de esas funciones. Aunque enumera las bibliotecas, especifica la biblioteca actual para las rutas de la biblioteca, lo que podría ser el problema. Tiene libssl.so and libcrypto.so en el directorio actual? -

Sí, los tengo en el directorio actual. -

Incluso con este comando gcc -I/home/aleksei/openSSL0.9.8/include -o app -L /home/aleksei/openSSL0.9.8/lib/ -lssl -lcrypto tema1.c todavía me da el mismo resultado. ¿Cómo puedo hacer que el enlazador encuentre las definiciones de esas funciones? -

Si escribo una ubicación que no existe para buscar las librerías, me da esto: /usr/bin/ld: cant find -lssl . Entonces significa que el enlazador los encuentra, pero ¿qué? -

Vuelca los símbolos en la biblioteca. nm libcrypto.so | grep AES_. ¿Aparece alguno de los símbolos que faltan? Si no (o su carta es U en lugar de T), entonces los símbolos realmente no están en la biblioteca libcrypto. Están en mi copia de 0.9.8r que compilé con la configuración predeterminada, pero supongo que es un OpenSSL que creaste tú mismo, ¿sí? -

2 Respuestas

Es posible que esté tratando de vincular estáticamente, pero el -L opción y -lcrypto están buscando un archivo para vincular dinámicamente. Para vincular estáticamente a una biblioteca específica, simplemente especifique su .a archivo en la línea de comando del compilador después de todos sus archivos fuente.

P.ej

gcc -I/home/aleksei/openSSL0.9.8/include -o app tema1.c ./libcrypto.a

Respondido el 12 de junio de 12 a las 23:06

Para aquellos de ustedes que tienen este mismo problema pero están usando Windows, Mingw y este OpenSSL para Windows (en este momento: Win32 OpenSSL v1.0.2a). Necesitas enlazar a libeay32.a que se encuentra en C:\OpenSSL-Win32\lib\MinGW\ (después de instalar OpenSSL).

En mi caso estoy usando CMake y el poderoso CLion IDE, así que tuve que cambiar el nombre de la biblioteca a libeay32.dll.a porque CMake no estaba localizando la biblioteca. Este es mi CMakeLists.txt:

cmake_minimum_required(VERSION 3.1)
project(openssl_1_0_2a)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

include_directories(C:\\OpenSSL-Win32\\include)

set(SOURCE_FILES main.cpp)

link_directories(C:\\OpenSSL-Win32\\lib\\MinGW)

add_executable(openssl_1_0_2a ${SOURCE_FILES})

target_link_libraries(openssl_1_0_2a eay32)

Hice la prueba con este ejemplo (que está tomado de esta respuesta):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "openssl/aes.h"

int main(int argc, char* argv[])
{
    AES_KEY aesKey_;
    unsigned char userKey_[16];
    unsigned char in_[16] = {0};
    unsigned char out_[16] = {0};
    strcpy((char *) userKey_,"0123456789123456");
    strcpy((char *) in_,"0123456789123456");

    fprintf(stdout,"Original message: %s\n", in_);
    AES_set_encrypt_key(userKey_, 128, &aesKey_);
    AES_encrypt(in_, out_, &aesKey_);

    AES_set_decrypt_key(userKey_, 128, &aesKey_);
    AES_decrypt(out_, in_,&aesKey_);
    fprintf(stdout,"Recovered Original message: %s XXX \n", in_);
    return 0;
}

contestado el 23 de mayo de 17 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.