如何选择依赖gcc的共享对象?

时间:2010-08-05 11:20:28

标签: c++ gcc linker shared-libraries

首先,我不知道我的问题是否有解决办法。

我有以下情况:

  • 我开发了一个框架库,它依赖于其他几个库来进行特定的硬件访问等。
  • 到目前为止,这个框架库只是静态链接。
  • 对于使用框架库的可执行文件,只需链接可执行文件实际使用的代码的依赖项。 (如果我根本不访问特定的硬件,则不必依赖其相关的库。)

现在我还需要创建框架库的共享对象。此外,依赖项可用作共享库,因此不需要任何静态链接。

我现在遇到的问题:

  • 构建动态链接到框架库的应用程序时,我必须将所有依赖项动态链接到框架库或应用程序。 (否则我从ld获得未定义的引用投诉)

我的问题:

  • 如果我知道我的应用程序不会使用依赖于此共享对象的框架库的任何代码,有没有办法忽略某些共享对象依赖项?

  • 有没有办法在没有代码更改的情况下执行此操作? (链接器/编译器开关)

我还需要原始情况中描述的静态链接仍然有用。

其他信息:

  • 操作系统:Linux(Debian Lenny)
  • 编译:gcc-4.3

2 个答案:

答案 0 :(得分:7)

您可以,但您基本上必须自己完成所有动态库处理。即dlopen库,然后使用dlsym直接查找所需的符号。

它会使你的代码变得更复杂,多少取决于你进入库的界面。

答案 1 :(得分:6)

来自man ld

  

<强> - 按需
  的 - 无按需

     

此选项会影响--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建议)

  

- 警告 - 未解决的符号

     

如果链接器要报告未解析的符号(请参阅选项--unresolved-symbols),它通常会生成错误。              此选项使其生成警告。