2014-07-18 16 views
11

Ben kopya yapıştırmayı ld adamı bir bölüm: - biri aslında bu seçeneği nasıl kullanıyorld için -u seçeneği nasıl çalışır ve ne zaman yararlı olur?

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

? Kaynak kodumdaki ek modüllerin nasıl bağlanacağını ve bu seçenek ne zaman yararlı olduğunu nasıl açıklayabilirim?

+2

Bu nasıl bir C++ sorusu? – dragosht

+0

Bir C++ kaynak kodu arıyorum Örnek – owagh

+1

Bulduğum tek ek bilgi, 'Bu seçenek EXTERN linker betiği komutuyla eşdeğerdir. ', Ancak bu komuttaki bilgiler aynıdır ancak '-u' ile eşdeğer bir notla. –

cevap

2

İlginç bir kullanım durumuyla ilgili bir örnek buldum. Ross, DLL'ler hakkında iyi bir fikir verirken, -u seçeneğini nasıl kullanabileceğinizi buradan öğrenebilirsiniz.

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: - Şimdi

#include "Factory.h" 

int main() { 
} 

biz bağladığınızda, biz seçebilirsiniz Bir nesne fabrikaya eklenir veya -u linker_a'yı ld komut satırına aktarıp aktarmadığımıza bağlı değildir. Eğer bunu komut satırında geçirirsek, fabrikaya bir A örneği eklenecektir aksi halde olmayacaktır.

Bu, main.cpp ve Factory öğesinin geliştirilmesine izin verir. {Cpp, h}, A. {cpp, h} 'den bağımsız olmalıdır (yani Factory.cpp, A örneğinin A olması için Ah içermek zorunda değildir. nesnelerin listesine eklendi). Böylece ek modüllerin ("A") bağlanması, bağlayıcı bayrak -u tarafından tetiklenir.

Çok düzgün bir özellik!

4

Aksi kodunuzda başvurulan bir statik kitaplıktan bir nesne dosyasında çekmek için kullanışlıdır. Statik kütüphaneyle bağlantı kurulduğunda linker sadece tanımlanmamış sembollere uyan nesneler kullanır.

Bu seçenek için pek çok gerçekçi kullanım durumu yoktur. Başka türlü ilgisiz olan bir nesneyi bağlamada genellikle bir nokta yoktur. Muhtemelen yararlı olsaydı, bir yere atıfta bulunulurdu. Yani dahil etmenin bazı garip yan etkisi olmalı.

Size verebileceğim tek gerçek örnek, Microsoft'un Windows altında benzer bir bağlayıcı seçeneği kullanıyor. Bir DLL içine DirectX hata mesajı kitaplığı (DXERR.LIB) dönüş yapmak istedi, ben de aşağıdakine benzer bir komut kullanılır:

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 

/include anahtarları LD görülüyor -u seçeneğin eşdeğerdir. Eğer bu anahtarları bırakmış olsaydım, ondan ihraç edilen hiçbir işleve sahip boş bir DLL aldım.

İlgili konular