在eclipse中加⼊.a静态链接库及动态库的⽅法
在eclipse中加⼊.a静态链接库及动态库的⽅法
在eclipse中加⼊.a静态链接库的⽅法。
Project->Properties->C/C++ Build->Tool Settings->Miscellaneous->other Objects:在⽂件系统中到**.a加⼊。
---------------------------------------------------------可爱的分割线----------------------------------------------------------
(⼀)
linux 动态库
[b]Linux[/b][b]下动态库使⽤⼩结[/b]
. 静态库和动态库的基本概念
静态库,是在可执⾏程序连接时就已经加⼊到执⾏码中,在物理上成为执⾏程序的⼀部分;使⽤静态库编译的程序运⾏时⽆需该库⽂件⽀持,哪⾥都可以⽤,但是⽣成
的可执⾏⽂件较⼤。动态库,是在可执⾏程序启动时加载到执⾏程序中,可以被多个可执⾏程序共享使⽤。使⽤动态库编译⽣成的程序相对较⼩,但运⾏时需要库⽂件⽀持,如果机器⾥没有这些库⽂件就不能运⾏。
2.
如何使⽤动态库
如何程序在连接时使⽤了共享库,就必
须在运⾏的时候能够到共享库的位置。linux的可执⾏程序在执⾏的时候默认是先搜索/lib和/usr/lib这两个⽬录,然后按照 /etc/f⾥⾯的配置搜索绝对路径。同时,Linux也提供了环境变量LD_LIBRARY_PATH供⽤户选择使⽤,⽤户可以通过设定它来查除默认路径之外的其他路径,如查/work/lib路径,你可以在/etc/rc.d/rc.local或其他系统启动后即可执⾏到的脚本
添加如下语句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查(详细参考《使⽤
LD_LIBRARY_PATH》)。
不过LD_LIBRARY_PATH的设定作⽤是全局的,过多的使⽤可能会影响到其他应⽤程序的运⾏,所以多⽤在调试。
(LD_LIBRARY_PATH的缺陷和使⽤准则,可以参考《Why
LD_LIBRARY_PATH is bad》)。通常情况下推荐还是使⽤gcc的-R或-rpath选项来在编译时就指定库的查路径,并且该库的路径信息保存在可执⾏⽂件中,运⾏时它会直接到该路
径查库,避免了使⽤LD_LIBRARY_PATH环境变量查。
3.库的链接时路径和运⾏时路径
现代连接器在处理动态库时将链接时路径(Link-time path)和运⾏时路径(Run-time path)分开,⽤户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运⾏时库的路径,⼤⼤提⾼了库应⽤的灵活性。⽐如我们做嵌⼊式
移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/
-llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib库),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过-rpath(或-R )、LD_LIBRARY_PATH指定查路径。
------------------------------------------------------------------------------------------------------------------------
linux 下的静态链接库为.a⽂件,动态链接库为.so⽂件。本⽂主要讲解linux下,⽤eclipse创建并使⽤动态链接库的⽅法。
⼀、eclipse 创建动态链接库
1、new -> project -> c++ Project
如图:选择Share Library -> Empty Project ,并输⼊⼯程名:share ,点击Finish,完成⼯程的创建。
2、在share⼯程中编写代码,或者引⼊⽂件系统。
(引⼊⽂件系统的⽅法:右键 share⼯程 -> import ->General ->File System ->选择想要制作成动态链接库的⽂件)
3、share⼯程中如果需要调⽤其他动态链接库,则需要添加其他动态链接库(添加⽅法与下⾯使⽤动态链接库中的相同),再编译。否则直接进⾏编译。
编译之后,会在Debug⽬录下产⽣ libshare.so ⽂件,即是我们需要的动态链接库
⼆、动态链接库的使⽤:
需要注意3点:
eclipse哪个版本好1、⼯程的 include 搜索路径中需要添加 share⼯程的路径(即动态链接库⼯程所在路径),因为编译时要⽤到⾥⾯的头⽂件(.h⽂件)
2、添加要搜索的动态链接库,此处是libshare.so,以及搜索路径
3、添加环境变量 LD_LIBRARY_PATH ,并且它的值是share⼯程的路径(即动态链接库⼯程所在路径)。或者编译的时候,将动态链接库的地址编译到⼯程中(当动态链接库⼜要调⽤⾃⼰创建的其他动态链接库时,此⽅法好⽤)。还有⼀种⽅法就是将动态链接库拷贝到
/usr/lib 或者/lib⽬录下。
参考:
当运⾏时,系统会在 LD_LIBRARY_PATH 所包含的路径中去寻动态链接库,即libshare.so,当然系统默认也会在/usr/lib 、/lib ⽬录下寻动态链接库
具体⽅法如下:
1、新建⼯程 new -> c++ Project -> Executable -> Empty Project
⼯程名为:mass
2、编写所需代码,包含动态链接库,此处是libshare.so
右键⼯程mass -> Properites -> C/C++ Build -> Settings -> Tool Settings
如图:
选择GCC C++ Linker -> Libraries ,在右上⾯的窗⼝处,点击+ 加号,添加 share 。在下⾯窗⼝处点击 + 加号,添
加 "${workspace_loc:/share/Debug}"
(/share/Debug 就是 libshare.so 所在的路径)
3、添加 include 搜索路径
如图:
选择C/C++ General -> Path and Symbols ->Reference ,会看到所有的⼯程名称,选择share⼯程,这样会⾃动在 include 的搜索路径中加⼊share所在路径。
注意:在Configuration ⼀栏最好选择 All Configurations
4、添加LD_LIBRARY_PATH环境变量
右键 mass ⼯程 -> Run As ->Run Configurations,出现如图窗⼝
左边选择 mass ⼯程 -> Environment -> New , 如图添加环境变量。
当然也可以不添加LD_LIBRARY_PATH ,⽽是将动态链接库的路径编译到⼯程中。
参考:
5、编译运⾏即可。
其他⽅法:
对于建⽴SharedLibrary,其实很简单,就是建⽴⼯程的时候选择Shared Library。
想必很多朋友都希望在eclipse中编译好动态库以后能在我们的程序中直接调⽤,并且不需要在调⽤程序(这⾥以test为例,库⼯程名为mylib)中去配置环境变
量LD_LIBRARY_PATH,或者在gcc编译时指定路径名(该⽅法也不错,很适⽤较少库⽂件的引⽤)
-R${workspace_loc:/mylib/Debug}
调⽤我们编译好的库有两步:
1.增加包含⽬录,在workspace中将需要的库包含进来
2.添加动态库名和库的路径
现在说下环境变量,使⽤LD_LIBRARY_PATH变量,选中project右键-> run as -> run configuration-> Environment,add⼀个,name为
LD_LIBRARY_PATH,value为${workspace_loc:/mylib/Debug},
这样程序能在eclipse中运⾏了,但我们想到终端运⾏却还是"error while loading sharedlibraries:...",要在终端运⾏,需要设置该坏境变量
(#exportLD_LIBRARY_PATH=/root/workspace/mylib/Debug/),很是不爽。
⽅法⼆:先看⼀段英⽂:
Onelink option you might use is ld's ``rpath'' option, which specifiesthe runtime library search path of that particular program beingcompiled. From gcc, you can invoke the rpath option by specifyingit this way:
-Wl,-rpath,$(DEFAULT_LIB_INSTALL_PATH)
Ifyou use this option when building the library client program, youdon't need to bother with LD_LIBRARY_PATH (described next) otherthan to ensure it's not conflicting, or using other techniques tohide the library.
所以我们可以在test中设置中加⼊⼀段,即⼯程Property -> C/C++build -> settings -> GCC CLinker-> Miscellaneous -> Link flags中添加-Wl,-rpath=/root/workspace/mylib/Debug,可完美编译哦...
另外⼀种让⼈⽐较满意的⽅法三:在⼯程Property -> C/C++ build-> settings -> GCC CLinker-> Miscellaneous-> other option 中添加
-R"${workspace_loc:/mylib/Debug}"
该⽅法很不错。是编译阶段做好连接⼯作,⽽且可在终端执⾏(./test)
我使⽤的⽅法四:主要是通过配置⽂件做好⼀些准备⼯作后,直接引⽤lib*.so⽂件
由于Linux动态库的默认搜索路径是/lib和/usr/lib64等类似的⽬录,如果在这些地⽅不到会按照配置⽂件/etc/f中指定的⽬录查,所以我们可以在/etc/f.d⽬录下创建*.conf(如f)配置⽂件,⽤来指定我们希望被查到的lib*.so,如往⾥写⼊/root/lib,随⾃⼰喜欢,⽅便管理就好。
在程序运⾏时,此⽬录便会被搜寻,我们可以将build好的lib*.so软连接到此,
#cd /root/lib/,
#ln -s /root/workspace/mylib/Debug/libmylib.so .
#ldconfig
这样设置好以后,可以很⽅便的管理,更重要的是我们再次调⽤库时就像调⽤系统的库⼀样,直接使⽤,不需要再去针对每⼀个调⽤程序做配置,感觉最爽对很多完美主义的朋友是很重要的。
#cd /root/workspace/test/Debug/
#ldd test
libmylib.so =>/root/lib/libmylib.so (0x00002b5f040f3000)
libc.so.6 => /lib64/libc.so.6(0x0000003829a00000)
/lib64/ld-linux-x86-64.so.2(0x0000003828a00000)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论