eclipse 添加静态库和动态库

使用eclipse进行交叉编译时,添加第三方库,会报错:
Inconsistency detected by ld.so: dl-deps.c: 622: _dl_map_object_deps: Assertion `nlist > 1’ failed!

发现是使用eclipse添加第三方库方法有问题。第三方库目录下,同时存在静态库和动态库。采用Properites->C/C++ Build->Settings->Cross Gcc Linker->Libraries,可以添加静态库和动态库,但如果同时存在静态库和动态库时,优先选择动态库,最终,生成的可执行文件在目标板上运行,发现没有动态库,将会出问题。可以由如下三个方式解决该问题:
1、使目录下,只有静态库;
2、使用-Wl,-dn 和-Wl,-dy来指定静态库和动态库,如:-Wl,-dn -lzlog -Wl,-dy -lpthread(我是手动修改makefile文件,如何用eclipse设定?);
3、在目标板上,添加第三方动态库到指定文件夹中;

或者,只采用Properites->C/C++ Build->Settings->Cross Gcc Linker->Libraries添加动态库,只采用Properites->C/C++ Build->Settings->Cross Gcc Linker->Miscellaneous->Other objects添加静态库。

一下是网友资料:
https://zhidao.baidu.com/question/1111796342385920459.html
gcc中静态连接和动态链接的方法:
1:GCC的静态连接,直接把静态库的名字放在gcc后面
例如:gcc -o test test.c staticlib.a
2:GCC的动态连接,使用-l指定库,-L指定库的路径,注意动态库名必须是lib开头,后缀名为.so
例如: gcc -o test test.c -lpthread -L/usr/lib/
3:静态库也可以采用动态库的连接方法,如果目录中同时存在2种库,gcc会优先选择动态库。如果一条gcc链接指令中既要链接动态库又要链接静态库,可以用-Wl,-dn 和-Wl,-dy参数选项来切换。

静态连接和动态链接的主要区别:
1:静态连接的时候,静态库的所有执行代码被直接编译到目标程序中。而动态连接的时候,仅仅把动态库的函数和变量的符号名,地址偏移量等导入到目标程序。只有在目标程序运行的时候才把动态库的执行代码加载到内存中。
2:动态链接的项目容易管理,把不同模块封装成不同的动态库,如果模块功能修改,一般只需要重新生成该动态库,不用重新编译其他模块和目标程序。而静态链接的程序修改任何一个地方都必须重新编译整个程序
3:静态链接生成的目标程序体积比动态链接的大,但是加载速度更快,发布更容易,不需要检查发布机器上是否有该动态库或者动态库版本是否符合要求。
4:如果多个程序使用一个动态库,则该库的执行代码只会在内存中加载一次。而静态库是多次加载(事实上静态库连接完就没用了,等于目标程序的一部分)。
5:从调试的角度来说,静态连接的程序调试方法和独立程序没有任何区别,而动态库的调试相对要复杂一些,因为库里面的符号地址都是相对地址。

你可能感兴趣的:(linux,zlog)