ld的-u选项如何工作以及何时有用?

时间:2014-07-18 21:26:30

标签: c++ ld

我正在复制粘贴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.

如何实际使用此选项?如何在源代码中触发其他模块的链接,以及该选项何时实际有用?

2 个答案:

答案 0 :(得分:4)

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

此选项没有很多实际用例。在一个未被引用的对象中链接通常没有意义。据推测,如果它有用,它将在某处被引用。所以包含它会产生一些奇怪的副作用。

我能给你的唯一真实例子就是在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。

答案 1 :(得分:2)

我找到了一个有趣用例的例子。虽然Ross对DLL有一个很好的观点,但是在这里你可以使用-u选项。

a.cpp: -

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

Factory.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的实例它的对象列表。)

因此,链接器标志-u将触发其他模块(&#34; A&#34;)的链接。

非常简洁的功能!