2013-01-04 57 views
22

के साथ कैसे लिंक करें मैं एलडी का उपयोग कर सी ++ के आउटपुट को जोड़ने की कोशिश कर रहा हूं और जी ++ नहीं। मैं केवल यह सीखने के लिए कर रहा हूं कि इसे कैसे करें, व्यावहारिक उद्देश्यों के लिए नहीं, इसलिए कृपया इसे g ++ के साथ करने का सुझाव न दें।सी ++ ऑब्जेक्ट फ़ाइलों को एलडी

this question को देखते हुए, व्यक्ति जब वे ld आदेश चला वही त्रुटि हो जाता है:

$ ld test.o -o test.out 
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8 
test.o: In function `main': 
test.cpp:(.text+0x1c): undefined reference to `strcasecmp' 
test.cpp:(.text+0x23): undefined reference to `std::cout' 
test.cpp:(.text+0x28): undefined reference to `std::ostream::operator<<(int)' 
test.cpp:(.text+0x2d): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' 
test.cpp:(.text+0x35): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' 
test.o: In function `__static_initialization_and_destruction_0(int, int)': 
test.cpp:(.text+0x75): undefined reference to `std::ios_base::Init::Init()' 
test.cpp:(.text+0x7a): undefined reference to `__dso_handle' 
test.cpp:(.text+0x84): undefined reference to `std::ios_base::Init::~Init()' 
test.cpp:(.text+0x89): undefined reference to `__cxa_atexit' 
ld: test.out: hidden symbol `__dso_handle' isn't defined 
ld: final link failed: Bad value 

जुड़ा हुआ पोस्ट में जवाब सुझाव है कि एक लिंकर तर्क के रूप में सी ++ पुस्तकालय जोड़ने तो समस्या का समाधान हो, मैंने कोशिश की

ld test.o -o test.out -llibstd++ 

जो है वे क्या सुझाव दिया है, और मैं भी libstdC++ या stdC++ जैसे अन्य पुस्तकालय के नाम का एक बहुत कोशिश की। लेकिन मैं हमेशा एक त्रुटि ऐसा

ld: cannot find -llibstd++ 

लग रहा है क्या मैं गलत कर रहा हूँ मिल जाएगा और कैसे मैं अपने वस्तु ld का उपयोग करके फ़ाइलें लिंक कर सकते हैं?

+0

यह करने के लिए व्यावहारिक नहीं है ... कभी भी। – rubenvb

+9

@ रूबेनव हां, और मैंने पहले से ही कहा है कि मैं इसे व्यावहारिक उद्देश्यों के लिए उपयोग नहीं कर रहा हूं: "मैं केवल यह सीखने के लिए कर रहा हूं कि इसे कैसे करें, व्यावहारिक उद्देश्यों के लिए नहीं।" क्या आप डाउनवोट थे? – gsingh2011

+0

हां, मैं डाउनवोट था। ऐसा करने की कोशिश करने के लिए यह एक बुरी बात है।एलडी का उपयोग करने का एकमात्र समय यह है कि जब आप अपना ओएस विकसित कर रहे हों, तो इस मामले में आपने शायद सभी सिस्टम पुस्तकालयों को स्वयं लिखा होगा। यह बहुत ही ओएस और सिस्टम और कॉन्फ़िगरेशन निर्भर है कि यह भी मजाकिया नहीं है। – rubenvb

उत्तर

22

यदि आप g++-v ध्वज के साथ चलाते हैं, तो आपको यह लिंक लाइन दिखाई देगी।

#include <iostream> 

int main(void) 
{ 
    std::cout << "Hello, world!" << std::endl; 
    return 0; 
} 

और g++ -v -o example example.cpp चलने से उत्पादन:

Using built-in specs. 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5.1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5.1) 
COLLECT_GCC_OPTIONS='-v' '-o' 'example' '-shared-libgcc' '-mtune=generic' 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/cc1plus -quiet -v -D_GNU_SOURCE example.cpp -D_FORTIFY_SOURCE=2 -quiet -dumpbase example.cpp -mtune=generic -auxbase example -version -fstack-protector -o /tmp/ccV8qjvd.s 
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" 
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../x86_64-linux-gnu/include" 
ignoring nonexistent directory "/usr/include/x86_64-linux-gnu" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/include/c++/4.4 
/usr/include/c++/4.4/x86_64-linux-gnu 
/usr/include/c++/4.4/backward 
/usr/local/include 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include-fixed 
/usr/include 
End of search list. 
GNU C++ (Ubuntu/Linaro 4.4.4-14ubuntu5.1) version 4.4.5 (x86_64-linux-gnu) 
    compiled by GNU C version 4.4.5, GMP version 4.3.2, MPFR version 3.0.0-p3. 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
Compiler executable checksum: d92fbc2d715a3b7e0f4133f0c40053e4 
COLLECT_GCC_OPTIONS='-v' '-o' 'example' '-shared-libgcc' '-mtune=generic' 
as -V -Qy -o /tmp/ccGHR0pc.o /tmp/ccV8qjvd.s 
GNU assembler version 2.20.51 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.20.51-system.20100908 
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../:/lib/:/usr/lib/:/usr/lib/x86_64-linux-gnu/ 
COLLECT_GCC_OPTIONS='-v' '-o' 'example' '-shared-libgcc' '-mtune=generic' 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/collect2 --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o example -z relro /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../.. -L/usr/lib/x86_64-linux-gnu /tmp/ccGHR0pc.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o 

वाह, क्या एक मेस यहाँ एक सरल उदाहरण कार्यक्रम है। सुविधाजनक रूप से लिंक लाइन आखिरी है, इसलिए आप देख सकते हैं कि क्या हो रहा है।

जैसा कि आपने नीचे अपनी टिप्पणी में देखा है, फ्रंट-एंड ld के बजाय collect2 का उपयोग कर रहा है। सौभाग्य से, collect2ld के लिए सिर्फ एक उपनाम है। यहाँ एक उदाहरण का उपयोग कर रहा है:

$ ls 
example.cpp 
$ c++ -c example.cpp 
$ ls 
example.cpp example.o 

फिर हम यह लिंक करने के लिए सामने के अंत का उपयोग करेंगे लिंक लाइन को देखने के लिए:

$ c++ -v -o example example.o 
Using built-in specs. 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5.1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5.1) 
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../:/lib/:/usr/lib/:/usr/lib/x86_64-linux-gnu/ 
COLLECT_GCC_OPTIONS='-v' '-o' 'example' '-shared-libgcc' '-mtune=generic' 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/collect2 --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o example -z relro /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../.. -L/usr/lib/x86_64-linux-gnu example.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o 

फिर

पहले के एक वस्तु फाइल उत्पन्न करते हैं बाइनरी को फेंक दें, और खुद को लिंक करें (आमतौर पर, मैंने लाइन को प्रतिलिपि/पेस्ट किया होगा, लेकिन इसे पढ़ने में आसान बनाने के लिए मैंने \ एस के साथ बहुमुखी तरीका किया है):

$ ls 
example example.cpp example.o 
$ rm example 
$ ls 
example.cpp example.o 
$ ld                \ 
> --build-id              \ 
> --eh-frame-hdr             \ 
> -m elf_x86_64             \ 
> --hash-style=gnu            \ 
> -dynamic-linker             \ 
> /lib64/ld-linux-x86-64.so.2          \ 
> -o example              \ 
> -z relro              \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o  \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o  \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o     \ 
> -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5       \ 
> -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5       \ 
> -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib   \ 
> -L/lib/../lib             \ 
> -L/usr/lib/../lib            \ 
> -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../..     \ 
> -L/usr/lib/x86_64-linux-gnu          \ 
> example.o              \ 
> -lstdc++              \ 
> -lm                \ 
> -lgcc_s               \ 
> -lgcc               \ 
> -lc                \ 
> -lgcc_s               \ 
> -lgcc               \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtend.o     \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o 

अंत में, इसे चलाएं!

$ ls 
example example.cpp example.o 
$ ./example 
Hello, world! 

आप शायद कुछ तर्कों को हटाकर उस लिंक लाइन को काफी कम कर सकते हैं।

$ ld                \ 
> -dynamic-linker             \ 
> /lib64/ld-linux-x86-64.so.2          \ 
> -o example              \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o  \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o  \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o     \ 
> example.o              \ 
> -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5       \ 
> -lstdc++              \ 
> -lc                \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtend.o     \ 
> /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o 

झंडे और पुस्तकालयों का यह सेट निश्चित रूप से क्या पुस्तकालय कार्यों और भाषा अपने कार्यक्रम का उपयोग करता है सुविधाओं पर निर्भर करेगा: यहाँ कम से कम सेट मैं कुछ प्रयोग के बाद के साथ आया है।

+0

क्या मैं collect2 के बजाय ld का उपयोग नहीं कर सकता? क्या फर्क पड़ता है? – gsingh2011

+0

@ gsingh2011 - 'collect2' * *' ld' है। मेरा जोड़ा उदाहरण देखें। –

+4

@ gsingh2011 आप * जी ++ 'के बजाय' ld' का उपयोग कर सकते हैं, लेकिन आपको ** बहुत अच्छा कारण के बिना ** ऐसा नहीं करना चाहिए। 'G ++ 'उपयोगों का आदेश' g ++ 'के रिलीज़ से अगले में बदल सकता है, और यदि आप मिलान करने के लिए अपना' ld' कमांड अपडेट नहीं करते हैं, तो आप कई ग़लत आश्चर्यों में हो सकते हैं। –