5

尝试 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。我正在使用或多或少与其他人相同的东西。这适用于 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 上有效???

4

2 回答 2

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
于 2013-01-04T03:47:45.350 回答
3

您的编译命令似乎可以在 OSX 上运行,但实际上是使用系统提供的OpenSSL 而不是您想要的版本进行编译和链接。它在 Ubuntu 上完全失败,因为您没有安装系统 OpenSSL 的标头和开发库链接。

这是因为您混淆了搜索路径选项,并且您需要其中两个。告诉 GCC 你在哪里使用-I. 告诉它您使用的目标代码库在哪里-L。在两个系统上,您需要的编译命令是这样的:

$ gcc -I /usr/local/openssl-1.0.1c/include -L /usr/local/openssl-1.0.1c/lib \
      -o server server.c -lssl -lcrypto
于 2013-01-04T03:52:59.407 回答