当前位置:首页 > 图片 > 视野图片 > 正文
文章正文

linux 动态库 链接 Linux下如何解决动态库的链接问题

图片 > 视野图片 > :linux 动态库 链接 Linux下如何解决动态库的链接问题是由美文导刊网(www.eorder.net.cn)为您精心收集,如果觉得好,请把这篇文章复制到您的博客或告诉您的朋友,以下是linux 动态库 链接 Linux下如何解决动态库的链接问题的正文:

Linux下如何解决动态库的链接问题

静态库是一种以空间换取时间和移植性的做法,一些情况下确实有着一定的意义,但是一些情况下,我们自己编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有必要采用静态编译的。而且,在一些大型项目中,我们很难避免去使用到开源库,举个例子,如果我们只是单纯引用了mysql数据库的几个接口,有必要将整个mysql源文件全部编译吗?代价未免太大。通常的做法,是将mysql的include和lib目录打包之后,一起进行发布,来增强可移植性,也就是今天这里说的动态编译。

但是,动态编译默认情况下,只会去系统默认指定的目录下进行查找lib***.so文件,甚至我们在Makefile中使用-L选项指明了LIB目录,编译不会出错,但在运行的时候,会出现下面这种报错:

/cgi_select: error while loading shared libraries: libmysqlclient.so.18:

cannot open shared object file: No such file or directory

解决这个问题,网上给出的方法挺多,这里不会全部列出,给出最常用的方法:

1、环境变量。使用export导入环境变量LD_LIBRARY_PATH,指明搜索路径。这个环境变量是临时指定动态库的搜索路径,是绑定终端的,至于什么原因,了解过Linux的同学应该知道,这里不多解释,为了说明问题,这里截图给出,具体用法如下:

再次说明,这种做法只是临时生效,在测试的时候为了方便可以使用,但是真正的项目发布,一般不会使用这种做法,因为需要在客户机器上创建环境变量之后才可以运行,我尝试了多种做法,想把命令放到脚本当中自动化去执行,但限于个人能力,尚未跨越子shell这一关。

2、第二种做法就显得更加有效。在/etc/ld.so.conf文件中,指明了动态库的搜索路径,一般请款下,文件内容为

include ld.so.conf.d/*.conf

表明,/etc/ld.so.conf.d目录下的所有*.conf文件中保存的都是动态库的搜索路径。这么说可能不太好理解,进入目录,随意打开一个文件,你就会明白,每个文件中只有一条或几条路径,如下:

[root@bogon ld.so.conf.d]# cat qt-i386.conf

/usr/lib/qt-3.3/lib<br>[root@bogon ld.so.conf.d]

# cat mysql-i386.conf

每一个工具的动态库,都有着自己的动态库路径,因此,我们可以在该目录下创建自己的*.conf文件,文件中保存自己指定的动态库路径即可,个人绝对,Linux对动态库搜索路径的封装做的真心不错。

当然更改其他*.conf文件或创建自己的动态库连接目录配置文件后,需要使用ldconfig命令使之生效。

[root@bogon ld.so.conf.d]# ldconfig

3、其他的做法就是一些很非主流的做法了,将你所需要的动态库文件直接放入系统默认路径,坦白讲,这样做法没有问题,但是这是在给自己埋地雷,迟早有一天会出大问题。

4、另外还有一种比较生僻的做法,但是开源工程中会用到。使用gcc的选项确实可以实现,-Wl -rpath指定路径,个人来说,很少使用这种做法,gcc/g++是一款很强大的编译工具,提供了上百个选项,有一大部分可能一辈子用不到,用到去查就可以了,没有必要太过深究。

本文出自 “暮回” 博客,请务必保留此出处http://muhuizz.blog.51cto.com/11321490/1927864

相关阅读:

返回搜狐,查看更多

Linux 动态库与静态库制作及使用详解

来源:IBM

转自:Linux爱好者

作者:陈鲁

Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题; 2)在 Linux 静态库的制作过程中发现有别于 Windows 下静态库的制作方法;3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题。本文就这三个问题针对 Linux 下标准库链接和如何巧妙构建 achrive(*.a) 展开相关介绍。

两个要知道的基本知识

Linux 应用程序因为 Linux 版本的众多与各自独立性,在工程制作与使用中必须熟练掌握如下两点才能有效地工作和理想地运行。

  1. Linux 下标准库链接的三种方式(全静态 , 半静态 (libgcc,libstdc++), 全动态)及其各自利弊。

  2. Linux 下如何巧妙构建 achrive(*.a),并且如何设置链接选项来解决 gcc 比较特别的链接库的顺序问题。

三种标准库链接方式选项及对比

为了演示三种不同的标准库链接方式对最终应用程序产生的区别, 这里用了一个经典的示例应用程序 HelloWorld 做演示,见 清单 1 HelloWorld。

#include <stdio.h>

#include <iostream>

using std::cout;

using std::endl;

int main(int argc, char* argv[])

{

printf("HelloWorld!(Printed by printf)\n");

cout<<"HelloWorld!(Printed by cout)"<<endl;

return 0;

}

三种标准库链接方式的选项及区别见 表 1

表 1. 三种标准库链接方式的选项及区别

上述三种标准库链接方式中,比较特殊的是 半静态链接方式,主要在于其还需要在链接前增加额外的一个步骤:

ln -s g++ -print-file-name=libstdc++.a,作用是将 libstdc++.a(libstdc++ 的静态库)符号链接到本地工程链接目录。

-print-file-name 在 gcc 中的解释如下:

-print-file-name=<lib> Display the full path to library <lib>

为了区分三种不同的标准库链接方式对最终生成的可执行文件的影响,本文从两个不同的维度进行分析比较:

维度一:最终生成的可执行文件对标准库的依赖方式(使用 ldd 命令进行分析)

ldd 简介:该命令用于打印出某个应用程序或者动态库所依赖的动态库

涉及语法:ldd [OPTION]… FILE…

其他详细说明请参阅 man 说明。

三种标准库链接方式最终产生的应用程序的可执行文件对于标准库的依赖方式具体差异见 图 1、图 2、图 3所示:

图 1. 全静态标准库链接方式

图 2. 全动态标准库链接方式

图 3. 半静态(libgcc,libstdc++) 标准库链接方式

通过上述三图,可以清楚的看到,当用 全静态标准库的链接方式时,所生成的可执行文件最终不依赖任何的动态标准库,而 全动态标准库的链接方式会导致最终应用程序可执行文件依赖于所有用到的标准动态库。

区别于上述两种方式的 半静态链接方式则有针对性的将 libgcc 和 libstdc++ 两个标准库非动态链接。

(对比 图 2与 图 3,可见在 图 3中这两个标准库的动态依赖不见了)

从实际应用当中发现,最理想的标准库链接方式就是半静态链接,通常会选择将 libgcc 与 libstdc++ 这两个标准库静态链接,从而避免应用程序在不同 Linux 版本间标准库依赖不兼容的问题发生。

(linux 动态库 链接)

维度二 : 最终生成的可执行文件大小(使用 size 命令进行分析)

size 简介:该命令用于显示出可执行文件的大小

涉及语法:size objfile…

其他详细说明请参阅 man 说明。

三种标准库链接方式最终产生的应用程序的可执行文件的大小具体差异见 图 4、图 5、图 6所示:

图 4. 全静态标准库链接方式

图 5. 全动态标准库链接方式

图 6. 半静态(libgcc,libstdc++) 标准库链接方式

通过上述三图可以看出,最终可执行文件的大小随最终所依赖的标准动态库的数量增加而减小。

从实际应用当中发现,最理想的是 半静态链接方式,因为该方式能够在避免应用程序于。

不同 Linux 版本间标准库依赖不兼容的问题发生的同时,使最终生成的可执行文件大小最小化。

示例链接选项中所涉及命令(引用 GCC 原文):

-llibrary

-l library:指定所需要的额外库

-Ldir:指定库搜索路径

-static:静态链接所有库

-static-libgcc:静态链接 gcc 库

-static-libstdc++:静态链接 c++ 库

关于上述命令的详细说明,请参阅 GCC 技术手册

Linux 下静态库(archive)的制作方式:

涉及命令:ar

ar 简介:处理创建、修改、提取静态库的操作

涉及选项:

t – 显示静态库的内容

r[ab][f][u] – 更新或增加新文件到静态库中

[s] – 创建文档索引

ar -M [<mri-] – 使用 ar 脚本处理

其他详细说明请参阅 man 说明。

示例情景:

假设现有如 图 7所示两个库文件

图 7. 示例静态库文件

从 图 7中可以得知,CdtLog.a 只包含 CdtLog.o 一个对象文件 , 而 xml.a 包含 TXmlParser.o 和 xmlparser.o 两个对象文件

现将 CdtLog.o 提取出来,然后通过 图 8方式创建一个新的静态库 demo.a,可以看出,demo.a 包含的是 CdtLog.o 以及 xml.a,而不是我们所预期的 CdtLog.o,TXmlParser.o 和 xmlparser.o。这正是区别于 Windows 下静态库的制作。

图 8. 示例静态库制作方式 1

这样的 demo.a 当被链接入某个工程时,所有在 TXmlParser.o 和 xmlparser.o 定义的符号都不会被发现,从而会导致链接错误,提示无法找到对应的符号。显然,通过图 8 方式创建 Linux 静态库是不正确的。

正确的方式有两种:

1.将所有静态库中包含的对象文件提取出来然后重新打包成新的静态库文件。

2.用一种更加灵活的方式创建新的静态库文件:ar 脚本。

显然,方式 1 是比较麻烦的,因为涉及到太多的文件处理,可能还要通过不断创建临时目录用于保存中间文件。

推荐使用如 清单 2 createlib.sh所示的 ar 脚本方式进行创建:

rm demo.a(linux 动态库 链接)

rm ar.mac

echo CREATE demo.a > ar.mac

echo SAVE >> ar.mac

echo END >> ar.mac

ar -M < ar.mac

ar -q demo.a CdtLog.o

echo OPEN demo.a > ar.mac

echo ADDLIB xml.a >> ar.mac

echo SAVE >> ar.mac

echo END >> ar.mac

ar -M < ar.mac

rm ar.mac

如果想在 Linux makefile 中使用 ar 脚本方式进行静态库的创建,可以编写如 清单 3 BUILD_LIBRARY所示的代码:

清单 3 BUILD_LIBRARY

define BUILD_LIBRARY

$(if $(wildcard $@),@$(RM) $@)

$(if $(wildcard ar.mac),@$(RM) ar.mac)

$(if $(filter %.a, $^),

@ echo CREATE $@ > ar.mac

@ echo SAVE >> ar.mac

@ echo echo END >> ar.mac(linux 动态库 链接)

@$(AR) -M < ar.mac

)

$(if $(filter %.o,$^),@$(AR) -q $@ $(filter %.o, $^))

$(if $(filter %.a, $^),

@ echo OPEN $@ > ar.mac

$(foreach LIB, $(filter %.a, $^),

@ echo ADDLIB $(LIB) >> ar.mac

)

@ echo SAVE >> ar.mac

@ echo END >> ar.mac

@$(AR) -M < ar.mac

@$(RM) ar.mac

)

endef

(linux 动态库 链接)

$(TargetDir)/$(TargetFileName):$(OBJS)

$(BUILD_LIBRARY)

通过 图 9,我们可以看到,用这种方式产生的 demo.a 才是我们想要的结果。

图 9. 巧妙创建的静态库文件结果

Linux 静态库链接顺序问题及解决方法:

正如 GCC 手册中提到的那样:

It makes a difference where in the command you write this option; the linker

searches and processes libraries and object files in the order they are specified.

Thus, ‘ foo.o -lz bar.o ’ searches library ‘ z ’ after file ‘ foo.o ’ but before

‘ bar.o ’ . If ‘ bar.o ’ refers to functions in ‘ z ’ , those functions may not be loaded.

(linux 动态库 链接)

为了解决这种库链接顺序问题,我们需要增加一些链接选项 :

$(CXX) $(LINKFLAGS) $(OBJS) -Xlinker “-(” $(LIBS) -Xlinker “-)” -o $@

通过将所有需要被链接的静态库放入 -Xlinker “-(” 与 -Xlinker “-)” 之间,可以是 g++ 链接过程中, 自动循环链接所有静态库,从而解决了原本的链接顺序问题。

涉及链接选项:-Xlinker

-Xlinker option

Pass option as an option to the linker. You can use this to supply system-specific

linker options which GCC does not know how to recognize.

小结

本文介绍了 Linux 下三种标准库链接的方式及各自利弊,同时还介绍了 Linux 下静态库的制作及使用方法,相信能够给 大多数需要部署 Linux 应用程序和编写 Linux Makefile 的工程师提供有用的帮助。返回搜狐,查看更多


一.如何在 Linux 下调试动态链接库

大家都知道在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上
-g 参数。
我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。

首先,假设我们准备这样的一个动态链接库:
QUOTE:
库名称是: ggg
动态链接库文件名是: libggg.so
头文件是: get.h
提供这样两个函数调用接口:
int get ();
int set (int a);
要生成这样一个动态链接库,我们首先编写这样一个头文件:
[Copy to clipboard]
CODE:
/************关于本文档********************************************
*filename: get.h
*purpose: 一个动态链接库头文件示例
*tided by: zhoulifa() 周立发 ()
Linux 爱好者 Linux 知识传播者 SOHO 族 开发者 最擅长 C 语言
*date time: 2006-11-15 21:11:54
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循 GPL
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*感谢 提供原始代码,
我在他的基础上整理了此文
*********************************************************************/
int get ();
int set (int a);
然后准备这样一个生成动态链接库的源文件:
[Copy to clipboard]
CODE:
/************关于本文档********************************************
*filename: get.cpp
*purpose: 一个动态链接库源文件示例
*tided by: zhoulifa() 周立发 ()
Linux 爱好者 Linux 知识传播者 SOHO 族 开发者 最擅长 C 语言
*date time:2006-11-15 21:11:54
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循 GPL
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*感谢 提供原始代码,
我在他的基础上整理了此文
*********************************************************************/
#include <stdio.h>
#include "get.h"

static int x=0;
int get ()
{
printf ("get x=%d\n", x);
return x;
}
int set (int a)
{
printf ("set a=%d\n", a);
x = a;
return x;
}
然后我们用 GNU 的 C/C++ 编译器来生成动态链接库,编译命令如下:
QUOTE:
g++ get.cpp -shar......余下全文>>


二.linux 什么时候使用 动态链接

  一、基础
  通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.a”的形式。

  其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是如雷贯耳的动态链接库(dynamic link library)技术。

  二、动态链接库的特点与优势

  首先让我们来看一下,把库函数推迟到程序运行时期载入的好处:

  1. 可以实现进程之间的资源共享。

  什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。

  2. 将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是一个很好的例子。

  3. 甚至可以真正坐到链接载入完全由程序员在程序代码中控制。

  程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们。

  三、动态链接库的创建

  由于动态链接库函数的共享特性,它们不会被拷贝到可执行文件中。在编译的时候,编译器只会做一些函数名之类的检查。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须实用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址不无关代码(Position Independent Code (PIC))。

  对gcc编译器,只需添加上 -fPIC 标签,如:

  gcc -fPIC -c file1.c
  gcc -fPIC -c file2.c
  gcc -shared libxxx.so file1.o file2.o

  注意到最后一行,-shared 标签告诉编译器这是要建立动态链接库。这与静态链接库的建立很不一样,后者用的是 ar 命令。也注意到,动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so”

  四、动态链接库的使用

  使用动态链接库,首先需要在编译期间让编译器检查一些语法与定义。

  这与静态库的实用基本一样,用的是 -Lpath 和 -lxxx 标签。如:

  gcc file1.o file2.o -Lpath -lxxx -o program.exe

  编译器会......余下全文>>


三.如何让linux加载当前目录的动态库

linux 加载当前目录的动态库的方法是:设置合适的环境变量LD_LIBRARY_PATH。
设置方法有以下三种:

1、临时修改,log out之后就失效
在terminal中执行:export LD_LIBRARY_PATH=./

2、让当前帐号以后都优先加载当前目录的动态库
修改~/.bash_profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH

3、让所有帐号从此都优先加载当前目录的动态库
修改/etc/profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH


四.linux 动态链接库名称里的数字代表什么?

Linux操作系统也提供了一种更为方便的动态库调用方式,也方便了其它程序调用,这种方式与Windows系统的隐式链接类似。其动态库命名方式为“lib*.so.*”。在这个命名方式中,第一个*表示动态链接库的库名,第二个*通常表示该动态库的版本号,也可以没有版本号。在这种调用方式中,需要维护动态链接库的配置文件/etc/ld.so.conf来让动态链接库为系统所使用,通常将动态链接库所在目录名追加到动态链接库配置文件中。如具有X window窗口系统发行版该文件中都具有/usr&#47功穿哆费馨渡鹅杀珐辑;X11R6/lib,它指向X window窗口系统的动态链接库所在目录。为了使动态链接库能为系统所共享,还需运行动态链接库的管理命令./sbin/ldconfig。在编译所引用的动态库时,可以在gcc采用 ?l或-L选项或直接引用所需的动态链接库方式进行编译。在Linux里面,可以采用ldd命令来检查程序依赖共享库。


五.如何查看linux动态链接库文件的版本等其他信息

ldd <可执行文件名> 查看可执行文件链接了哪些
系统动态链接库
nm <可执行文件名>
查看可执行文件里面有哪些符号
strip <可执行文件名>
去除符号表可以给可执行文件瘦身
如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令
strings
<可执行文件名>

Linux操作系统上面的动态共享库大致分为三类:

1、操作系统级别的共享库和基础的系统工具库

比方说libc.so, libz.so,
libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/l缉花光拘叱饺癸邪含矛ib64和/usr
/lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6
/lib64目录。此外还可能有其他特定Linux版本的系统库目录。

这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。

2、应用程序级别的系统共享库

并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数,而在运行的时候自动到/usr/local
/lib下面去寻找共享库。

以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢?因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。这个文件的内容格式大致如下:

/usr/X11R6/lib64
/usr/X11R6/lib
/usr/local/lib
/lib64
/lib
/usr/lib64
/usr/lib
/usr/local/lib64
/usr/local/ImageMagick/lib

假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面,并且希望其他应用程序都可以使用
ImageMagick的动态共享库,那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc/ld.so.conf文件里面,然后执行:ldconfig
命令即可。

ldcofig将搜索以上所有的目录,为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库,我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下:

strings
/etc/ld.so.cach......余下全文>>


六.linux 把动态库(libxxx.so)进行静态链接

不行的。要静态链接就要使用静态库(libxxx.a).


七.linux中怎样包含一个动态链接库

第一步,我先从简单的调用出发,定义了一个简单的函数,该函数仅仅实现一个整数加法求和:

LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 导入定义:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a,int b);
}
在C#中调用测试:

int iSum = RefComm.mySum(,);

运行查看结果iSum为5,调用正确。第一步试验完成,说明在C#中能够调用自定义的动态链接库函数。

第二步,我定义了字符串操作的函数(简单起见,还是采用前面的函数名),返回结果为字符串:

LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a); return a;}
C# 导入定义:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中调用测试:

string strDest="";
string strTmp= RefComm.mySum("45", strDest);

运行查看结果 strTmp 为"45",但是strDest为空。我修改动态链接库实现,返回结果为串b:

LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a) return b;}
修改 C# 导入定义,将串b修改为ref方式:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再调用测试:

string strDest="";
string strTmp= RefComm.mySum("45", ref strDest);
运行查看结果 strTmp 和 strDest 均不对,含不可见字符。再修改 C# 导入定义,将CharSet从Auto修改为Ansi:

public class RefComm
{
[DllImport(&......余下全文>>


八.linux下gcc如何链接多个动态链接库

gcc a.c -L/uer/a/lib -la -lb -lc -ld


九.(linux)动态链接库找不到路径

ld.c虎钉港固蕃改歌爽攻鲸onf 我记得只针对运行有效。不过修改后需要 ldconfig 刷新才真正起作用。
gcc 编译有自己的链接库搜索路径,如果不在默认(32 位 /lib /usr/lib ,别的还什么地址忘了),必须用 -L 参数设置地址。

话说,把程序装到 /usr/local 下面自定义目录的这种安装方法,纯粹是找抽人写的胡扯文章。


十.如何让自己的动态链接库文件能够在linux下被调用

  如何让自己的动态链接库文件能够在linux下被调用
  
  VxWorks 安装的DVD有很多自己的动态链接库文件,在启动一些服务的时候需要调用这些动态链接库文件,否则不能启动一些功能,report:找不到相关的库文件。
  
  解决的方法可以有多种:
  
  1. 直接创建软连接的方式,将某动态链接库文件链接到 /lib 或者/usr/lib 下。
  
  ln -s `pwd`/xxx.so /lib/xxx.so
  
  这种方式适合少数固定不变动态链接库文件的调用,但如果文件很多,或者这些文件也是经常存在更新的,这么多比较繁琐。
  
  
  2. 如果直接把动态链接库文件所在的路径直接加到系统查找库的路径下,这里有两种方式:
  
  1) 更改/etc/ld.so.conf, 加入自己的动态链接库路径,好像需要更新/etc/ld.so.cache; 该方法应该可用,没有尝试过。
  
  2) 更改环境变量LD_LIBRARY_PATH,把自己的动态链接库路径,加入到该环境变量中。
  export LD_LIBRARY_PATH=/Jenkins/workspace/Mefa_Nightly_regression_Job02/MAIN/mefa_platform/logs_1st_round/mefaImage&#4尝耽佰甘脂仿拌湿饱溅7;simulatorTools:$LD_LIBRARY_PATH
  在该环境变量中的动态链接库文件会比系统中/lib 或者 /usr/lib 更早调用。
  
  linux重启之后,该环境变量会失效;
  这种方式更适合自动化的测试的需要。

  • linux找不到动态库 Linux下动态库和静态库的制作及使用
  • linux 添加动态库 Linux下如何解决动态库的链接问题
  • linux 动态库 链接 Linux下如何解决动态库的链接问题由美文导刊网(www.eorder.net.cn)收集整理,转载请注明出处!原文地址http://www.eorder.net.cn/pic60238/

    文章评论
    Copyright © 2006 - 2016 www.eorder.net.cn All Rights Reserved
    美文导刊网 版权所有