【问题标题】:Linux C++ linker /usr/bin/ldLinux C++ 链接器 /usr/bin/ld
【发布时间】:2012-04-10 04:07:25
【问题描述】:

我使用 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/ 引起的?如果是,如何添加?

谢谢。

【问题讨论】:

标签: c++ linux linker


【解决方案1】:

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

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

更多详情请见Diego E. Pettenò: Linkers and names

【讨论】:

    【解决方案2】:

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

    注意,您也可以指定 LD_LIBRARY_PATH,但这样做会被视为 harmful。 (该链接特别提到了 Solaris,但这些问题也适用于其他操作系统。)

    引用:

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

    【讨论】:

      【解决方案3】:

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

      然后运行“sudo ldconfig”使更改生效。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-01-18
          • 2018-02-06
          • 1970-01-01
          • 1970-01-01
          • 2019-02-23
          • 2021-05-07
          • 1970-01-01
          • 2023-01-30
          • 2017-02-11
          相关资源
          最近更新 更多