13

我正在复制粘贴以下人的一部分ld:-

-u symbol
--undefined=symbol
  Force symbol to be entered in the output file as an undefined symbol. Doing this
  may,for example, trigger linking of additional modules from standard libraries.
  `-u' may be       repeated with different option arguments to enter additional
  undefined symbols.

如何实际使用此选项?就像我如何在我的源代码中触发附加模块的链接一样,这个选项什么时候真正有用?

4

2 回答 2

6

这对于从静态库中提取目标文件很有用,否则代码中不会引用该目标文件。与静态库链接时,链接器仅使用其中满足未定义符号的对象。

这个选项没有很多实际的用例。链接一个原本未被引用的对象通常是没有意义的。据推测,如果它有用,它会在某处被引用。因此,将其包含在内肯定会产生一些奇怪的副作用。

我可以给您的唯一真实示例是在 Windows 下使用 Microsoft 链接器的类似选项。我想把 DirectX 错误信息库 (DXERR.LIB) 变成一个 DLL,所以我使用了类似于以下的命令:

link /machine:ix86 /dll /out:dxerr.dll /base:0x400000
    /include:_DXGetErrorStringA@4 /export:_DXGetErrorStringA@4
    /include:_DXGetErrorStringW@4 /export:_DXGetErrorStringW@4
    dxerr.lib mscvrt.lib user32.lib kernel32.lib 

这些/include开关相当于 ld 的-u选项。如果我把这些开关放在外面,我会得到一个空的 DLL,没有从中导出任何函数。

于 2014-07-19T02:18:02.830 回答
2

我发现了一个有趣的用例示例。尽管罗斯对 DLL 提出了很好的观点,但这里是您可以使用 -u 选项的方法。

a.cpp :-

class A {
 public:
  static int init() {
    Factory::getInstance()->addObject(new A());
    return 0;
  }
};
int linker_a = A::init();

工厂.cpp:-

class Factory {
 public:
  Factory* getInstance() { return _instance; }
  void addObject(void* obj) { objects_.push_back(obj); }
 private:
  vector<void*> objects_;
  static Factory* _instance;
};

main.cpp :-

#include "Factory.h"

int main() {
}

现在我们链接时,我们可以根据是否将 -u linker_a 传递给 ld 的命令行来选择是否将 A 对象添加到工厂中。如果我们在命令行上传递它,A 的一个实例将被添加到工厂,否则它不会。

这允许 main.cpp 和 Factory.{cpp,h} 的开发独立于 A.{cpp,h} (即 Factory.cpp 不必包含 Ah 以便将 A 的实例添加到其列表中对象)。

因此,附加模块(“A”)的链接由链接器标志 -u 触发。

非常整洁的功能!

于 2014-07-21T15:04:04.587 回答