尝试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链接到包含文件夹,并给我一个错误,它找不到SSL。 我正在使用或多或less与其他人一样的东西 。 这适用于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中创build一个到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上工作?
没有找到头文件的问题似乎是你混淆了你的选择。 -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
你的编译命令似乎在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