首先,我不知道我的问题是否有解决办法.
我有以下情况:
我开发了一个框架库,它依赖于其他几个库来进行特定的硬件访问等.
到目前为止,这个框架库只是静态链接.
对于使用框架库的可执行文件,只需链接可执行文件实际使用的代码的依赖项.(如果我根本不访问特定的硬件,我不必依赖它的相关库.)
现在我还需要创建框架库的共享对象.此外,依赖项可用作共享库,因此不需要任何静态链接.
我现在遇到的问题:
构建动态链接到框架库的应用程序时,我必须将所有依赖项动态链接到框架库或应用程序.(否则我得到来自ld的未定义的引用投诉)
我的问题:
如果我知道我的应用程序不会使用依赖于此共享对象的框架库的任何代码,是否有任何方法可以忽略某些共享对象依赖项?
有没有办法在没有代码更改的情况下执行此操作?(链接器/编译器开关)
我还需要原始情况中描述的静态链接仍然有效.
附加信息:
操作系统:Linux(Debian Lenny)
编译器:gcc-4.3
Douglas Leed.. 7
您可以,但您基本上必须自己完成所有动态库处理.即dlopen
图书馆,然后直接查找您需要的符号dlsym
.
它会使你的代码更复杂,多少取决于你进入库的接口.
您可以,但您基本上必须自己完成所有动态库处理.即dlopen
图书馆,然后直接查找您需要的符号dlsym
.
它会使你的代码更复杂,多少取决于你进入库的接口.
从 man ld
--as-needed
--no-as-needed此选项会影响--as-needed选项后命令行中提到的动态库的ELF DT_NEEDED标记.通常,链接器将为命令行中提到的每个动态库添加DT_NEEDED标记,而不管是否实际需要该库.--as-needed导致只为满足常规对象的符号引用的库发出DT_NEEDED标记,这些对象在链接库时未定义,或者,如果在其他DT_NEEDED列表中找不到库,则链接到该点的库,来自另一个动态库的引用.--no-as-need恢复默认行为.
我自己没有用过,但听起来就像你在找什么.
g++ -o your_app -Wl,--as-needed -lframework -la -lb -lc -Wl,--no-as-needed
编辑(由Hanno建议)
--warn悬而未决符号
如果链接器要报告未解析的符号(请参阅选项--unresolved-symbols),它通常会生成错误.此选项使其生成警告.