【问题标题】:Compiling dynamically linked library in a makefile在生成文件中编译动态链接库
【发布时间】:2022-01-25 01:22:56
【问题描述】:

我正在尝试使用 make 文件运行我的库。我目前有一个名为 libname.so 的动态库,我通过链接我的一些 C 文件的目标文件来创建它。当我在我的 linux shell 中运行以下代码行时,这个库可以正常工作:

   gcc -L. main1.c -lname -o out
   LD_LIBRARY_PATH=.
   export LD_LIBRARY_PATH

但是,当我将这些确切的代码行复制到 make 文件中并将此函数的 make 文件标题命名为“names”,然后在 linux shell 中运行“make names”时,我收到以下错误:

./out: error while loading shared libraries: libname.so: cannot open shared object file: No such file or directory

然后当我再次运行 makefile 函数末尾显示的最后两行代码然后运行 ​​out 文件时,它被修复并且程序再次运行。

我只需要弄清楚如何直接从 makefile 中使其工作。

【问题讨论】:

  • 如果我理解正确,您的 makefile 会正确构建 out,但是当您尝试运行 out 时会出现运行时错误,因为...工作目录不在 @987654325 中@?如果这是问题所在,那么您无法从 makefile 中修复它。进程不允许修改调用它的进程的环境变量,因此 Make 无法在您运行 Make 的 shell 中修改 LD_LIBRARY_PATH
  • 是的,您理解正确。在构建库文件期间我可以做些什么或任何可以解决我的问题的事情?
  • -L. 您的库 libname.so 是否与源文件位于同一文件夹中?如果没有,您可能需要将库路径从 . 更改为实际路径。

标签: c linux gcc dll makefile


【解决方案1】:
LD_LIBRARY_PATH=.
export LD_LIBRARY_PATH

这两行不会以任何方式影响程序的创建,因为您在创建程序之后键入这些行。

这些行不用于构建程序,但它们会影响程序的运行(通过输入./out)。

如果您直接使用gcc(不使用make)编译程序并打开一个新终端,您还必须在运行程序之前(再次)键入这两行。

如何构建程序并不重要(手动输入gcc 或运行make):

打开一个新的终端后,你需要在运行程序之前输入这两行代码。

但是,动态链接器不仅使用来自LD_LIBRARY_PATH 的路径信息,还使用来自可执行文件中DT_RUNPATH 信息的路径信息。

与仅在一个控制台(或终端)上设置的LD_LIBRARY_PATH 变量不同,DT_RUNPATH 信息直接存储在可执行文件中。

another question on this site中所述,您可以使用-Wl,-rpath=<value>开关设置DT_RUNPATH信息:

gcc -L. main1.c -lname -o out -Wl,-rpath=.

如果您这样做,动态链接器将在当前目录中搜索您的库(libname.so,如果我理解正确的话)。

注意:

.真正的意思是:在当前目录下;不代表:和可执行文件在同一个目录!

如果您的程序存储在目录./somedir 中并且您键入somedir/out,则搜索文件./libname.so,而不是文件./somedir/libname.so

-Wl,-rpath= 方法和 LD_LIBRARY_PATH= 方法都是这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2012-09-24
    • 2012-09-18
    相关资源
    最近更新 更多