在Ubuntu和OSX上编译和链接OpenSSL

时间:2013-01-04 03:42:14

标签: c linux macos gcc

尝试1,Vanilla Link to Library

我正在尝试使用修补版本的OpenSSL(因此DTLS更易于使用)。

中的OpenSSL
/usr/local/openssl-1.0.1c

./include/openssl子文件夹有大量的头文件(我认为应该这样):

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链接到include文件夹并给我一个错误 - 它无法找到SSL。我正在使用或多或少the same thing other people are。这适用于OSX(10.6),但不适用于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.

尝试2,/ usr / include中与库的符号链接

那么,我尝试在/ usr / include中创建一个指向OpenSSL的符号链接:

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

并重新尝试编译:

~$ 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

为什么第一种方法(即没有符号链接)不起作用?权限?为什么第二种方法不起作用?为什么这适用于OSX ???

2 个答案:

答案 0 :(得分:9)

找不到头文件的问题似乎是你混淆了你的选择。 -L添加链接库搜索路径的路径,而-I将目录添加到预处理器头文件搜索路径。将-L更改为-I以解决该问题:

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

现在链接器问题是因为您错误地使用-L选项告诉链接器在包含路径中查找库。您需要将该路径更改为库所在的目录,通常是lib子目录。此外,链接器希望库的顺序与它们的顺序相反,因此在命令行中将要链接的库放在最后:

$ gcc -I/usr/local/openssl-1.0.1c/include server.c -o server.o \
    -L/usr/local/openssl-1.0.1c/lib -lssl -lcrypto

答案 1 :(得分:3)

您的编译命令出现以在OSX上工作,但实际上是在编译和链接系统提供的 OpenSSL而不是您想要的版本。它在Ubuntu上完全失败,因为你没有安装系统OpenSSL的头文件和开发库链接。

这是因为您将搜索路径选项混淆了,并且您需要其中两个选项。告诉GCC你在哪里使用标题-I。要告诉它你在哪里使用对象代码库-L。您需要的编译命令ON BOTH SYSTEMS就是这样的:

$ gcc -I /usr/local/openssl-1.0.1c/include -L /usr/local/openssl-1.0.1c/lib \
      -o server server.c -lssl -lcrypto