当前位置: 技术问答>linux和unix
linux中的动态库和静态库的问题
来源: 互联网 发布时间:2016-10-19
本文导语: 请问,linux中, 动态库可以调用静态库中的函数吗? 是不是必须在编译动态库时就需要把静态库链接进来?在程序运行中,动态库是否可以使用静态库的函数? 例如,动态库中的函数dynamic_bbb(),调用了函数static_...
请问,linux中,
动态库可以调用静态库中的函数吗? 是不是必须在编译动态库时就需要把静态库链接进来?在程序运行中,动态库是否可以使用静态库的函数?
例如,动态库中的函数dynamic_bbb(),调用了函数static_aaa(),而函数static_aaa()是存在于一个静态库中,
在动态库的代码中,extern了函数 static_aaa(),因此虽然这时的编译选项并没有把这个静态库加进来,但是编译动态库是不会有问题的。
主程序中,链接了这个静态库,并且也使用了这个静态库中的函数static_aaa(),而这个动态库中的函数dynamic_bbb()会被主程序调用。
请问这种情况下,运行时,动态库里的函数可以正常调用并运行函数 static_aaa()吗?
我遇到的问题是,动态库本身的编译没有问题。主程序编译也没有问题,但是运行时,一旦遇到应该调用函数 static_aaa()时,就会报错说undefined symbol。
请问,是否在编译动态库时,需要把静态库链接进来?如果这样做的话,因为主程序也用到了静态库,并且也链接了静态库,是否会有函数 static_aaa()重复定义的问题?
谢谢。
动态库可以调用静态库中的函数吗? 是不是必须在编译动态库时就需要把静态库链接进来?在程序运行中,动态库是否可以使用静态库的函数?
例如,动态库中的函数dynamic_bbb(),调用了函数static_aaa(),而函数static_aaa()是存在于一个静态库中,
在动态库的代码中,extern了函数 static_aaa(),因此虽然这时的编译选项并没有把这个静态库加进来,但是编译动态库是不会有问题的。
主程序中,链接了这个静态库,并且也使用了这个静态库中的函数static_aaa(),而这个动态库中的函数dynamic_bbb()会被主程序调用。
请问这种情况下,运行时,动态库里的函数可以正常调用并运行函数 static_aaa()吗?
我遇到的问题是,动态库本身的编译没有问题。主程序编译也没有问题,但是运行时,一旦遇到应该调用函数 static_aaa()时,就会报错说undefined symbol。
请问,是否在编译动态库时,需要把静态库链接进来?如果这样做的话,因为主程序也用到了静态库,并且也链接了静态库,是否会有函数 static_aaa()重复定义的问题?
谢谢。
|
不会有函数 static_aaa()重复定义的问题。
1. 编译库(不管是动态库或静态库),都不需要解析外部符号,这就是“在动态库的代码中,extern了函数 static_aaa(),因此虽然这时的编译选项并没有把这个静态库加进来,但是编译动态库是不会有问题的。”的原因
2. 编译执行文件时,需要解析外部符号,才需要链接库文件。
1. 编译库(不管是动态库或静态库),都不需要解析外部符号,这就是“在动态库的代码中,extern了函数 static_aaa(),因此虽然这时的编译选项并没有把这个静态库加进来,但是编译动态库是不会有问题的。”的原因
2. 编译执行文件时,需要解析外部符号,才需要链接库文件。