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

興味深いユースケースの例を見つけました。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() {
}

これで、リンク時に、ld のコマンド ラインに -u linker_a を渡すかどうかに基づいて、A オブジェクトをファクトリに追加するかどうかを選択できます。コマンド ラインで渡すと、A のインスタンスがファクトリに追加されます。それ以外の場合は追加されません。

これにより、main.cpp と Factory.{cpp,h} の開発を A.{cpp,h} から独立させることができます (つまり、A のインスタンスをそのリストに追加するために、Factory.cpp に Ah を含める必要はありません)。オブジェクトの)。

したがって、追加モジュール (「A」) のリンクは、リンカー フラグ -u によってトリガーされます。

非常にきちんとした機能!

于 2014-07-21T15:04:04.587 に答える