2014-07-18 13 views
11

jestem kopiowaniem wklejanie sekcję z człowiekiem ld: -Jak działa opcja -u dla ld i kiedy jest przydatna?

-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. 

Jak można faktycznie skorzystać z tej opcji? W jaki sposób wyzwalam łączenie dodatkowych modułów w moim kodzie źródłowym, a kiedy ta opcja jest rzeczywiście przydatna?

+2

Jak to jest pytanie C++? – dragosht

+0

Poszukuję przykład kodu źródłowego C++ – owagh

+1

Jedyne dodatkowe informacje, które udało mi się znaleźć, to: "Ta opcja jest równoważna komendzie EXTERN skryptu skryptu .", Ale informacje o tym poleceniu są takie same, ale z dopiskiem, że jest to odpowiednik '-u'. –

Odpowiedz

2

Znalazłem przykład z interesującym przypadkiem użycia. Podczas gdy Ross mówi dobrze o bibliotekach DLL, oto jak możesz użyć opcji -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() { 
} 

Teraz kiedy łączymy, możemy wybrać, czy Obiekt zostanie dodany do fabryki lub nie w oparciu o to, czy przekazujemy -u linker_a do wiersza poleceń ld. Jeśli przekażemy go w linii poleceń, instancja A zostanie dodana do fabryki, inaczej nie będzie.

Pozwala to na rozwój main.cpp i Factory. {Cpp, h} jest niezależny od A. {cpp, h} (tzn. Factory.cpp nie musi zawierać Ah, aby instancja A była dodano do jego listy obiektów).

Łączenie dodatkowych modułów ("A") jest uruchamiane przez flagę łącznika -u.

Bardzo schludna funkcja!

4

Przydaje się do pobrania pliku obiektowego z biblioteki statycznej, do której w kodzie nie ma odniesienia. Łącząc się z biblioteką statyczną, linker używa tylko obiektów, które spełniają niezdefiniowane symbole.

Dla tej opcji nie ma zbyt wielu realistycznych przypadków użycia. Zwykle nie ma sensu łączenie w obiekcie, który poza tym nie ma żadnych odniesień. Przypuszczalnie gdyby był przydatny, byłby gdzieś przywoływany. Musi więc istnieć jakiś dziwny efekt uboczny związany z włączeniem go.

Jedyny prawdziwy przykład, jaki mogę ci dać, to taki, który używa podobnej opcji łącznika Microsoftu pod Windows. Chciałem włączyć bibliotekę DirectX komunikat o błędzie (DXERR.LIB) do DLL, więc użyłem polecenia podobny do następującego:

link /machine:ix86 /dll /out:dxerr.dll /base:0x400000 
    /include:[email protected] /export:[email protected] 
    /include:[email protected] /export:[email protected] 
    dxerr.lib mscvrt.lib user32.lib kernel32.lib 

W /include przełączniki są odpowiednikiem -u opcji LD jest. Gdybym zostawił te przełączniki, dostałbym pustą bibliotekę DLL bez wyeksportowanych funkcji.

Powiązane problemy