当前位置: 首页 > 面试题库 >

在Ubuntu vs OSX上编译和链接OpenSSL

朱修德
2023-03-14
问题内容

尝试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上可以使用?


问题答案:

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


 类似资料:
  • 主要内容:编译(Compile),链接(Link),总结我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为 可执行程序(Executable Program)。在 Windows 下,可执行程序的后缀有 和 (其中 比较常见);在类 UNIX 系统(Linux、Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判断是否是可执行程序。 可执行程序的内部是一系列计算机指令和数据的集合,它们都是二进制形式的,CPU 可

  • 编译和链接参数是每一个C/C++程序员需要经常面对的问题。构建每一个C/C++应用均需要经过编译和链接两个步骤,CGO也是如此。 本节我们将简要讨论CGO中经常用到的编译和链接参数的用法。 2.10.1 编译参数:CFLAGS/CPPFLAGS/CXXFLAGS 编译参数主要是头文件的检索路径,预定义的宏等参数。理论上来说C和C++是完全独立的两个编程语言,它们可以有着自己独立的编译参数。 但是因

  • 虽然我们到现在为止还没有写任何一行代码,但我们确实得到了一个完整的可运行的程序。要编译运行程序,可以选择Build-(或按快捷键F7),编译该程序。编译完后再选择Build-Execute Hello.exe(或按快捷键CTRL+F5),运行该程序。也可以直接按CTRL+F5,系统提示是否编译,回答“Yes”,Visual Studio将自动编译链接并运行Hello.exe程序。 提示:在Buil

  • 我成功地编写了一个带有点精灵的标准基本变换反馈粒子系统。没有闪烁,粒子从一个缓冲区更新到下一个缓冲区,然后进行渲染,然后输出缓冲区在下一次迭代时成为输入缓冲区。所有GPU端,标准转换反馈。精彩的一个大问题是:只有在我不使用gl_PointCoord的情况下,它才有效。在我的点精灵中使用平面颜色效果很好。但我需要gl_PointCoord做任何有意义的事。我所有的着色器,不管是否使用gl_Point

  • 推荐: http://www.ruanyifeng.com/blog/2014/11/compiler.html Bulid过程可以分解为4个步骤:预处理(Prepressing), 编译(Compilation)、汇编(Assembly)、链接(Linking) 以c语言为例: 1 预处理 预编译过程主要处理那些源文件中的以“#”开始的预编译指令,主要处理规则有: 将所有的“#define”删除

  • 创建指令时,可以将代码放入编译器、链接函数或控制器中。 在文件中,他们解释说: 编译和链接功能用于角度循环的不同阶段 然而,对我来说还不清楚,哪种代码应该去哪里。 例如:我可以在compile中创建函数并将它们附加到link中的作用域,还是只将函数附加到controller中的作用域? 如何在指令之间共享控制器,如果每个指令可以有自己的控制器?控制器是真的共享,还是只是范围属性?