Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compiling and linking OpenSSL on Ubuntu vs OSX

Tags:

c

linux

macos

gcc

Attempt 1, Vanilla Link to Library

I'm trying to use a patched version of OpenSSL (so DTLS is easier to use). OpenSSL is in

/usr/local/openssl-1.0.1c

The ./include/openssl subfolder has a ton of header files (as I assume it should):

lrwxrwxrwx 1 root root   22 Dec 25 05:49 aes.h -> ../../crypto/aes/aes.h
lrwxrwxrwx 1 root root   24 Dec 25 05:49 asn1.h -> ../../crypto/asn1/asn1.h
lrwxrwxrwx 1 root root   28 Dec 25 05:49 asn1_mac.h -> ../../crypto/asn1/asn1_mac.h
...

GCC links to the include folder and gives me an error- it cannot find SSL. I'm using more or less the same thing other people are. This works, on OSX (10.6), but not on Ubuntu:

~$ gcc -L/usr/local/openssl-1.0.1c/include -lssl -lcrypto  -o server server.c
server.c:20:25: fatal error: openssl/ssl.h: No such file or directory
compilation terminated.

Attempt 2, Symbolic Link to Library in /usr/include

So, then I try creating a symbolic link to OpenSSL in my /usr/include:

sudo ln -s /usr/local/openssl-1.0.1c/include/openssl /usr/include/openssl

and re-attempting compilation:

~$ gcc -L/usr/local/openssl-1.0.1c/include -lssl -lcrypto  -o server server.c
/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto
collect2: ld returned 1 exit status
make: *** [server] Error 1

Why does the first method (ie no symbolic link) not work? Permissions? Why does the second method not work? Why does this work on OSX???

like image 853
nflacco Avatar asked Jan 04 '13 03:01

nflacco


1 Answers

The problem with the header file not being found seems to be you mixing up your options. -L adds a path to the linker library search paths, while -I adds a directory to the preprocessor header file search path. Change the -L to -I to solve that problem:

$ gcc -I/usr/local/openssl-1.0.1c/include server.c -o server.o

Now the linker problem is because you erroneously use the -L option to tell the linker to look for libraries in the include path. You need to change that path to the directory where the libraries are, usually a lib subdirectory. Also, the linker wants libraries in reverse order of their dependencies, so place the libraries you want to link with last on the command line:

$ gcc -I/usr/local/openssl-1.0.1c/include server.c -o server.o \
    -L/usr/local/openssl-1.0.1c/lib -lssl -lcrypto
like image 195
Some programmer dude Avatar answered Oct 04 '22 05:10

Some programmer dude