我正在复制粘贴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.
如何实际使用此选项?如何在源代码中触发其他模块的链接,以及该选项何时实际有用?
答案 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;)的链接。
非常简洁的功能!