在 makefile 中编译动态链接库
Compiling dynamically linked library in a makefile
我正在尝试 运行 我的库使用生成文件。我目前有一个名为 libname.so 的动态库,它是通过链接我的一些 C 文件的 object 文件创建的。当我 运行 我的 linux shell 中的以下代码行时,该库可以正常工作:
gcc -L. main1.c -lname -o out
LD_LIBRARY_PATH=.
export LD_LIBRARY_PATH
但是当我将这些确切的代码行复制到一个 make 文件中并为这个函数命名 make 文件标题时 'names' 然后 运行 'make names' in linux shell,我得到以下错误:
./out: error while loading shared libraries: libname.so: cannot open shared object file: No such file or directory
然后当我再次 运行 makefile 函数末尾显示的最后两行代码然后 运行 out 文件时,它被修复并且程序再次运行。
我只需要弄清楚如何直接从 makefile 让它工作。
LD_LIBRARY_PATH=.
export LD_LIBRARY_PATH
这两行不会以任何方式影响程序的创建,因为您在创建程序后键入了行。
这些行不用于构建您的程序,但它们会影响 运行 程序(通过键入 ./out
)。
如果您直接使用 gcc
编译程序(而不是使用 make
)并打开一个新终端,您还必须在 运行 之前(再次)输入这两行程序。
无论您如何构建程序(通过手动输入 gcc
或通过 运行 宁 make
):
打开新终端后,您需要在 运行 程序之前输入这两行。
但是,动态链接器不仅使用来自 LD_LIBRARY_PATH
的路径信息,还使用来自 DT_RUNPATH
可执行文件中的信息。
与仅在一个控制台(或终端)上设置的 LD_LIBRARY_PATH
变量不同,DT_RUNPATH
信息直接存储在可执行文件中。
如所述,您可以使用-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=
方法都是这种情况。
我正在尝试 运行 我的库使用生成文件。我目前有一个名为 libname.so 的动态库,它是通过链接我的一些 C 文件的 object 文件创建的。当我 运行 我的 linux shell 中的以下代码行时,该库可以正常工作:
gcc -L. main1.c -lname -o out
LD_LIBRARY_PATH=.
export LD_LIBRARY_PATH
但是当我将这些确切的代码行复制到一个 make 文件中并为这个函数命名 make 文件标题时 'names' 然后 运行 'make names' in linux shell,我得到以下错误:
./out: error while loading shared libraries: libname.so: cannot open shared object file: No such file or directory
然后当我再次 运行 makefile 函数末尾显示的最后两行代码然后 运行 out 文件时,它被修复并且程序再次运行。
我只需要弄清楚如何直接从 makefile 让它工作。
LD_LIBRARY_PATH=. export LD_LIBRARY_PATH
这两行不会以任何方式影响程序的创建,因为您在创建程序后键入了行。
这些行不用于构建您的程序,但它们会影响 运行 程序(通过键入 ./out
)。
如果您直接使用 gcc
编译程序(而不是使用 make
)并打开一个新终端,您还必须在 运行 之前(再次)输入这两行程序。
无论您如何构建程序(通过手动输入 gcc
或通过 运行 宁 make
):
打开新终端后,您需要在 运行 程序之前输入这两行。
但是,动态链接器不仅使用来自 LD_LIBRARY_PATH
的路径信息,还使用来自 DT_RUNPATH
可执行文件中的信息。
与仅在一个控制台(或终端)上设置的 LD_LIBRARY_PATH
变量不同,DT_RUNPATH
信息直接存储在可执行文件中。
如-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=
方法都是这种情况。