小编典典

在Ubuntu vs OSX上编译和链接OpenSSL

linux

尝试1,香草链接到图书馆

我正在尝试使用修补版本的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。我或多或少地在使用与别人相同的东西。这在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上可以使用?


阅读 258

收藏
2020-06-07

共1个答案

小编典典

找不到头文件的问题似乎是您混淆了选项。-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
2020-06-07