2012-05-04 7 views
22

यहां क्या गलत हो सकता है?प्रतीक के अनिश्चित संदर्भ के बावजूद जब एनएम इंगित करता है कि यह प्रतीक साझा लाइब्रेरी में मौजूद है

#include "libmnl/libmnl.h" 

int main() { 
    struct mnl_socket *a = mnl_socket_open(12); 
} 

और एक सरल gcc संकलन (gcc -lmnl main.c) मैं निम्नलिखित त्रुटियाँ प्राप्त चलाने के बाद:

/tmp/cch3GjuS.o: In function `main': 
main.c:(.text+0xe): undefined reference to `mnl_socket_open' 
collect2: ld returned 1 exit status 

साझा लाइब्रेरी पर एनएम चल रहा है पता चलता है कि यह वास्तव में पाया है: मैं निम्नलिखित सरल वर्ग है

[email protected]:/tmp$ nm -D /usr/lib/libmnl.so | grep mnl_socket_open 
0000000000001810 T mnl_socket_open 

यह उबंटू 12.04 पर हो रहा है। libmnl-dev और libmnl0 पैकेज स्थापित हैं। gcc की strace उत्पादन इंगित करता है कि ld बिल्कुल * .so फ़ाइल उपयोग कर रहा है:

[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.a", 0x7fff2a39b4d0) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.a", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.a", 0x7fff2a39b4d0) = -1 ENOENT (No such file or directory) 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.a", O_RDONLY) = -1 ENOENT (No such file or directory) 
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libmnl.so", {st_mode=S_IFREG|0644, st_size=18608, ...}) = 0 
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libmnl.so", O_RDONLY) = 7 

उत्तर

33

पुस्तकालय वस्तुओं है कि उन्हें उपयोग करने के बाद सूचीबद्ध किया जाना चाहिए (अधिक सटीक, एक पुस्तकालय केवल उपयोग किया जाएगा अगर यह एक प्रतीक होता है कि उस समय ज्ञात एक अपरिभाषित संदर्भ को पूरा करता है जब इसका सामना किया जाता है)। कमांड के अंत में -lmnl ले जाएं।

+0

धन्यवाद, यह तेज़ था। मुझे लगता है कि ऑब्जेक्ट के बाद मैंने "गलती से" इस्तेमाल किया था, इसलिए चीजें अभी तक ठीक काम कर रही थीं। –

संबंधित मुद्दे