尝试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 ???
答案 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