views:

167

answers:

4

I am trying to compile a small .c file that has the following includes:

#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/x509.h>
#include <openssl/evp.h>

In the same folder where i have the .c file I have a /openssl with all those files (and more), also in synaptic package manager I see OpenSSL installed, I am trying to compile with this:

gcc -o Opentest Opentest.c -lcrypto

but I always get the errors:

error: openssl/ssl.h: No such file or directory
error: openssl/rsa.h: No such file or directory
error: openssl/x509.h: No such file or directory
error: openssl/evp.h: No such file or directory

The file I want to compile is only a .c file, doesnt have Makefile or ./configure.

I already tried:

env CFLAGS=-I/path/to/openssl/

and tried to compile again but i get the same errors.

What should I do in order to compile with openssl includes?

+3  A: 

Use the -I flag to gcc properly.

gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c

The -I should point to the directory containing the openssl folder.

Borealid
gcc -I/home/username/Programming/openssl/ -o Opentest -lcrypto Opentest.c it gives me the same errors :(
jahmax
To elaborate on your answer if the openssl folder is `/path/to/openssl/` then the option needs to be `-I/path/to/` @jahmax. so you want `/home/username/Programming/`
Earlz
@Earlz : Thanks, I tried to say that with the last explicit line but it must have gotten missed.
Borealid
Thanks, that worked, but now I get errors in the includes inside openssl/ssl.h, that include files that are inside /openssl/subfolders, how can I make gcc to find those?
jahmax
@jah if you are being "bad" and your own project's include path(`openssl/*`) doesn't match OpenSSL's (possible `*`) then you could have this problem. The best solution is to change your project to use `ssl.h` instead of `openssl/ssl.h` etc. The quick fix is to set include paths for both `/path/to/` and `/path/to/openssl/`
Earlz
A: 

If the OpenSSL headers are in the openssl sub-directory of the current directory, use:

gcc -I. -o Opentest Opentest.c -lcrypto

The pre-processor looks to create a name such as "./openssl/ssl.h" from the "." in the -I option and the name specified in angle brackets. If you had specified the names in double quotes (#include "openssl/ssl.h"), you might never have needed to ask the question; the compiler on Unix usually searches for headers enclosed in double quotes in the current directory automatically, but it does not do so for headers enclosed in angle brackets (#include <openssl/ssl.h>). It is implementation defined behaviour.

You don't say where the OpenSSL libraries are - you might need to add an appropriate option and argument to specify that, such as '-L /opt/openssl/lib'.

Jonathan Leffler
i tried -L/usr/lib but I still get errors in all the includes from ssl.h, why gcc cant find them?
jahmax
A: 

From the openssl.pc file

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries and tools
Version: 0.9.8g
Requires:
Libs: -L${libdir} -lssl -lcrypto
Libs.private: -ldl -Wl,-Bsymbolic-functions -lz
Cflags: -I${includedir}

You can note the Include directory path and the Libs path from this. Now your prefix for the include files is /home/username/Programming . Hence your include file option should be -I//home/username/Programming.

(Yes i got it from the comments above)

This is just to remove logs regarding the headers. You may as well provide -L<Lib path> option for linking with the -lcrypto library.

Praveen S
I still get errors in all the includes used by ssl.h, why gcc cant find those?
jahmax
A: 

Your include paths indicate that you should be compiling against the system's OpenSSL installation. You shouldn't have the .h files in your package directory - it should be picking them up from /usr/include/openssl.

The plain OpenSSL package (libssl) doesn't include the .h files - you need to install the development package as well (libssl-dev).

caf
Thank you, that was easy.
jahmax
@jahmax: No worries. You will find that most library packages in Debian-based distros have a `*-dev` package that you will need to compile against the library (and often a `*-dbg` package containing debugging symbols for the library).
caf