Linux C++ linker /usr/bin/ld

Linux C++ linker /usr/bin/ld

本文关键字:bin ld usr Linux linker C++      更新时间:2023-10-16

我使用g++4.4.6在Redhat Linux 6上编写了一个小型应用程序。编译后,我收到一个错误

/usr/bin/ld: cannot find -lcrypto

我搜索了加密库,在这里找到了它们,

[root@STL-DUNKEL01 bin]# find / -name libcrypto*
/usr/lib64/libcrypto.so.0.9.8e
/usr/lib64/libcrypto.so.10
/usr/lib64/libcrypto.so.6
/usr/lib64/libcrypto.so.1.0.0

我的问题是,编译错误是否是由/usr/bin/ld在搜索路径中没有usr/lib64/引起的?如果是,我该如何添加?

谢谢。

不,您可能错误地诊断了原因。

您需要一个libcrypto.so进行链接。这通常是到一个实际库的符号链接,其soname(libcrypto.so.??)将嵌入二进制文件中。运行时只需要该库,但编译时需要符号链接。

请参阅Diego E.Pettenå:链接器和名称以了解更多详细信息。

调用gcc或ld时必须添加-L/usr/lib64

注意,您也可以指定LD_LIBRARY_PATH/,但这样做被认为是有害的。(链接特别提到Solaris,但这些问题也适用于其他操作系统。)

报价:

  • LD_LIBRARY_PATH优先于任何运行时或默认系统链接器路径。如果(上帝保佑)你把它设置为/dcs/spod/baduser/lib,如果该目录中有一个被黑客入侵的libc版本(例如),你的帐户可能会被泄露。正是由于这个原因,设置uid程序完全忽略LD_LIBRARY_PATH
  • 当代码被编译并依赖于它来工作时,当不同版本的库安装在不同的目录中时,可能会引起混乱,例如/usr/openwin/lib和/usr/local/lib中有一个libtiff。在这种情况下,以前的库是Solaris附带的一些程序使用的旧库
  • 有时,当使用预编译的二进制文件时,它们可能是在特定位置使用第三方库构建的;理想情况下,代码应该随库一起提供并安装到某个位置,或者作为预安装步骤链接代码。Solaris7引入了$ORIGIN,它允许在运行时指定相对的库位置(请参阅SolarisLinker和LibrariesGuide)。另一种选择是在每个程序的基础上设置LD_LIBRARY_PATH,将其作为实际程序的包装程序或shell别名。但是,请注意,LD_LIBRARY_PATH可能会被封装的程序调用的程序继承

将目录添加到/etc/ld.so.conf

然后运行"sudoldconfig"使更改生效。

您可以提供在中搜索库的目录,作为gcc的参数,就像-L<directory_to_search_in>一样。注意,-L可以有多个参数。此外,您是在尝试构建32位应用程序还是64位应用程序?