Linking issues using OpenSSL in Ubuntu

17,704

you need to link to libcrypto as well - add -lcrypto to the link line and your code should link correctly.

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

links correctly, while:

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

does not.

Share:
17,704
dijkstra
Author by

dijkstra

Computer Engineer

Updated on June 18, 2022

Comments

  • dijkstra
    dijkstra almost 2 years

    I have installed OpenSSL using sudo apt-get install openssl-dev. When I try to compile it using Netbeans it gives following errors. How can I fix this problem?

    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'
    

    My code is here:

    #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;
    }
    
  • Climax
    Climax about 10 years
    I experienced the same problem, however I was linking with -lcrypto. What fixed it for me was by linking with crypto after ssl. Why the order matters goes beyond me.
  • Ben Aveling
    Ben Aveling about 6 years
    @climax Order matters with libraries. Until libssl was processed, OPENSSL_add_all_algorithms_noconf etc were not needed. So when libcrypto was first processed, they were not included in the build. Later, when they were needed, libcrypto had already been processed.