2012-10-16 2 views
1

sudo를 사용하여 openussl을 설치했습니다 apt-get install openssl-dev을 설치하십시오. Netbeans을 사용하여 컴파일하려고하면 다음 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까?우분투에서 OpenSSL을 사용하는 링크 오류

g++  -lssl -o dist/Debug/GNU-Linux-x86/cppapplication_2 build/Debug/GNU-Linux-x86/main.o -L/home/sercan/Desktop/openssl-0.9.8h-1-lib/lib 
build/Debug/GNU-Linux-x86/main.o: In function `main': 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:46: undefined reference to `OPENSSL_add_all_algorithms_noconf' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:48: undefined reference to `ERR_load_crypto_strings' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:58: undefined reference to `d2i_PKCS12_fp' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:66: undefined reference to `ERR_print_errors_fp' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:72: undefined reference to `PKCS12_parse' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:76: undefined reference to `ERR_print_errors_fp' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:82: undefined reference to `PKCS12_free' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:96: undefined reference to `PEM_write_PrivateKey' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:104: undefined reference to `PEM_write_X509_AUX' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:108: undefined reference to `sk_num' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:114: undefined reference to `sk_value' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:114: undefined reference to `PEM_write_X509_AUX' 
/home/sercan/NetBeansProjects/CppApplication_2/main.cpp:112: undefined reference to `sk_num' 

내 코드는 여기에 있습니다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <openssl/pem.h> 
#include <openssl/err.h> 
#include <openssl/pkcs12.h> 

/* Simple PKCS#12 file reader */ 

int main(int argc, char **argv) 
{ 

    FILE *fp; 
    EVP_PKEY *pkey; 
    X509 *cert; 
    STACK_OF(X509) *ca = NULL; 
    PKCS12 *p12; 
    int i; 

    if (argc != 4) { 
     fprintf(stderr, "Usage: pkread p12file password opfile\n"); 
     exit(1); 
    } 

    OpenSSL_add_all_algorithms(); 
    ERR_load_crypto_strings(); 

    if (!(fp = fopen(argv[1], "rb"))) { 
     fprintf(stderr, "Error opening file %s\n", argv[1]); 
     exit(1); 
    } 

    p12 = d2i_PKCS12_fp(fp, NULL); 

    fclose(fp); 

    if (!p12) { 
     fprintf(stderr, "Error reading PKCS#12 file\n"); 
     ERR_print_errors_fp(stderr); 
     exit(1); 
    } 

    if (!PKCS12_parse(p12, argv[2], &pkey, &cert, &ca)) { 
     fprintf(stderr, "Error parsing PKCS#12 file\n"); 
     ERR_print_errors_fp(stderr); 
     exit(1); 
    } 

    PKCS12_free(p12); 

    if (!(fp = fopen(argv[3], "w"))) { 
     fprintf(stderr, "Error opening file %s\n", argv[1]); 
     exit(1); 
    } 

    if (pkey) { 
     fprintf(fp, "***Private Key***\n"); 
     PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL); 
    } 

    if (cert) { 
     fprintf(fp, "***User Certificate***\n"); 
     PEM_write_X509_AUX(fp, cert); 
    } 

    if (ca && sk_X509_num(ca)) { 
     fprintf(fp, "***Other Certificates***\n"); 
     for (i = 0; i < sk_X509_num(ca); i++) 
      PEM_write_X509_AUX(fp, sk_X509_value(ca, i)); 
    } 

    fclose(fp); 

    return 0; 
} 

답변

6

당신은뿐만 아니라 libcrypto 링크를 할 필요가 - 링크 라인에 -lcrypto를 추가하고 코드가 제대로 연결해야합니다.

natsu:~/openssl% gcc -o test test.c -L/usr/lib -lssl -lcrypto 

링크가 올바르게 동안 :

natsu:~/openssl% gcc -o test test.c -L/usr/lib -lssl   
/tmp/ccvA7iNe.o: In function `main': 
test.c:(.text+0x4c): undefined reference to `OPENSSL_add_all_algorithms_noconf' 
test.c:(.text+0x51): undefined reference to `ERR_load_crypto_strings' 
test.c:(.text+0xb9): undefined reference to `d2i_PKCS12_fp' 
test.c:(.text+0x103): undefined reference to `ERR_print_errors_fp' 
test.c:(.text+0x133): undefined reference to `PKCS12_parse' 
test.c:(.text+0x16a): undefined reference to `ERR_print_errors_fp' 
test.c:(.text+0x180): undefined reference to `PKCS12_free' 
test.c:(.text+0x22c): undefined reference to `PEM_write_PrivateKey' 
test.c:(.text+0x266): undefined reference to `PEM_write_X509_AUX' 
test.c:(.text+0x27b): undefined reference to `sk_num' 
test.c:(.text+0x2b7): undefined reference to `sk_value' 
test.c:(.text+0x2c9): undefined reference to `PEM_write_X509_AUX' 
test.c:(.text+0x2d9): undefined reference to `sk_num' 
collect2: ld returned 1 exit status 

하지 않습니다.

+0

동일한 문제가 발생했지만, -lcrypto와 연결되었습니다. 저를 위해 고쳐진 무엇이 ssl 후에 암호로 연결해서이었다. 주문 문제가 왜 저를 넘어서는가요? – Climax

+0

@climax 라이브러리와 관련된 문제를 주문하십시오. libssl이 처리 될 때까지 OPENSSL_add_all_algorithms_noconf 등은 필요하지 않았습니다. 따라서 libcrypto가 처음 처리 될 때 빌드에 포함되지 않았습니다. 나중에 필요할 때 libcrypto가 이미 처리되었습니다. –

관련 문제