在Ubuntu和OSX上编译和链接OpenSSL

尝试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