2012-05-04 24 views
22

Điều gì có thể sai ở đây? Tôi có lớp đơn giản sau đây:tham chiếu không xác định cho biểu tượng ngay cả khi nm cho biết biểu tượng này có trong thư viện được chia sẻ

#include "libmnl/libmnl.h" 

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

Và sau khi chạy một gcc biên dịch đơn giản (gcc -lmnl main.c) tôi nhận được các lỗi sau đây:

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

Chạy nm trên thư viện chia sẻ cho thấy rằng nó thực sự tìm thấy:

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

Điều này đang diễn ra trên Ubuntu 12.04. Các gói libmnl-devlibmnl0 được cài đặt. Các strace sản lượng gcc chỉ ra rằng ld đang sử dụng chính xác điều đó * .so file:

[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 

Trả lời

33

Libraries phải được liệt kê sau khi các đối tượng sử dụng chúng (chính xác hơn, thư viện sẽ được sử dụng chỉ khi nó chứa một biểu tượng mà đáp ứng một tham chiếu không xác định được biết tại thời điểm nó được gặp phải). Di chuyển -lmnl đến cuối lệnh.

+0

Cảm ơn bạn, điều đó thật nhanh. Tôi đoán trong quá khứ tôi "vô tình" sử dụng -l sau khi đối tượng, vì vậy mọi thứ đã làm việc tốt cho đến bây giờ. –

Các vấn đề liên quan