Undefined reference to SSL_library_init and SSL_load_error_strings
Asked Answered
E

5

24

I am implementing a OpenSSL code and have already included required header files but still I am getting errors like *

undefined reference to SSL_library_init

I guess it's a linking error rather than a compilation error.

I am implementing it in Linux box using slickeditor.

Earleneearley answered 8/4, 2011 at 9:42 Comment(16)
And how are you invoking the linker? Are you instructing it to link against the OpenSSL library, such as with -lcrypto for gcc?Virescent
nope. the machine I got already has openssl. when I do which openssl it shows be path like /usr/bin/openssl. So the next step I did was to include header files in my existing code and then in slickeditor property i i tried to include -llibeay32 and -lssleay32. But no joyEarleneearley
The OpenSSL library is called libcrypto. Link to it with with -lcrypto. I don't know anything about SlickEdit. Is it invoking the compiler and linker for you, is that done in a makefile, or do you do it on a command line? Somehow you need to tell the linker to link to libcrypto. For invoking gcc on the command line, this means adding the option -lcrypto.Virescent
New udpate. I did try to include -lssl in slickeditor and still no joyEarleneearley
The slickeditor provides complier G++ and linker as well. I did try to add -lcrypto in it. Also I have noticed there is -lcrpt and not crypto there. Still no joyEarleneearley
Apologies, SSL_library_init is in libssl, so the link option would be -lssl. ldd $(which openssl) will show you how your openssl is linked and where those libraries are. If it still doesn't work, perhaps that directory is not on the path for the linker. You can add that path with -Lpath, such as -L/lib/Virescent
I have copied both libraires from /usr/lib into directory of project lib and issued command -lssl and -lcrypto .. But still no joyEarleneearley
on typing command ld $(which openssl) I got following o/pEarleneearley
' 'linux-gate.so.1 => (0x00110000) libssl.so.7 => /lib/libssl.so.7 (0x00411000) libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00919000) libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00877000) libcom_err.so.2 => /lib/libcom_err.so.2 (0x007ec000)Earleneearley
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x004d2000) libresolv.so.2 => /lib/libresolv.so.2 (0x007d5000) libcrypto.so.7 => /lib/libcrypto.so.7 (0x03d94000) libdl.so.2 => /lib/libdl.so.2 (0x0038d000)Earleneearley
libz.so.1 => /lib/libz.so.1 (0x003cd000) libc.so.6 => /lib/libc.so.6 (0x001f7000) libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x004f9000) libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00872000)Earleneearley
So libssl is in /lib/. Try the linker options -L/lib/ -lssl (in that order).Virescent
I cant able to issue via command prompt . But I will try to figure out how to use linker in slickeditor as I am also too new in slick editorEarleneearley
You should get a minimal test case working on the command line. #include "whatever" \n int main(void) { SSL_library_init(blah, blah, blah); return 0; } and then g++ my_minimal_test_case.c++ -lssl. If this works then you don't understand your editor/IDE. If it doesn't then you have some configuration issue.Virescent
Yeah thats works . SO I guess there is prob with my editor. I will investigate in that. AND THANKS A LOT for helpEarleneearley
Thats done. I have copied crypto.a and ssl.a into lib folder of project and added -lcrypto -lssl in make file and its done.Earleneearley
D
32

Link against libssl and libcrypto. Your LDFLAGS and LDLIBS would be as follows. Order matters for LDLIBS:

LDFLAGS = -L/usr/local/ssl/lib
LDLIBS = -lssl -lcrypto

Don't worry about adding the "lib" in front of library name, or the "so" or "a" suffix. The linker will do it for you.

If you are building from the command line, then you would use the following. Again, order matters.

gcc foo.c -o foo.exe -L/usr/local/ssl/lib -lssl -lcrypto

If you are using the system's OpenSSL, then you can omit -L/usr/local/ssl/lib.

Declass answered 2/12, 2013 at 7:50 Comment(3)
According to comments on the question, SSL_library_init is in libssl, so shouldn't the correct order be LDLIBS = -lcrypto -lssl instead?Pseudoscope
@CraigScott - Sorry about the late reply. Order matters because its a single pass linker. When LD encounters unsatisfied link symbols, it notes them and looks for them in libraries that follow. If libcrypto was first, then libssl would have unsatisfied symbols like BN_new because libcrypto needs to follow libssl to satisfy the missing symbols. The other option is a two-pass linker. Sometimes you will also see something like -la -lb -la (liba followed by libb followed by liba). Its usually due to a circular reference lurking behind the scenes.Declass
"Order matters" was the key for me. Thanks.Androus
M
12

For me this meant to install

 apt install libssl1.0-dev
Murmur answered 12/7, 2018 at 0:24 Comment(2)
You're a lifesaver. Was trying to compile AOSP on Ubuntu 18, and had to downgrade openssl 1.1 -> 1.0.1 , but had installed libssl-devMillhon
High five to both of you. I had the same issue and the combination of these two comments made me realize it.Eadwina
P
8

These methods are deprecated in OpenSSL 1.1. You don't need to use it more. You can just remove it. More info in OpenSSL manual.

Parthenope answered 15/4, 2020 at 14:15 Comment(0)
C
1

Simply add -lssl -lcrypto to your Makefile and it should work.

Example of Makefile:

foo: foo.o
g++ -std=c++17 -o foo foo.cpp -lcrypto -lssl
Carpentaria answered 29/9, 2022 at 16:24 Comment(0)
B
0

ldd libssl.so -> libcrypto.so.1.1 => not found

sudo ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007f17d46c7000)

Barner answered 17/3, 2017 at 19:14 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.