2009-06-05 34 views
91

Tôi làm việc trong Linux với C++ (Eclipse) và muốn sử dụng thư viện. Eclipse cho tôi thấy lỗi:Lỗi Linux C++: tham chiếu không xác định đối với 'dlopen'

undefined reference to 'dlopen' 

Bạn có biết giải pháp không?

Đây là mã của tôi:

#include <stdlib.h> 
#include <stdio.h> 
#include <dlfcn.h> 

int main(int argc, char **argv) { 
    void *handle; 
    double (*desk)(char*); 
    char *error; 

    handle = dlopen ("/lib/CEDD_LIB.so.6", RTLD_LAZY); 
    if (!handle) { 
     fputs (dlerror(), stderr); 
     exit(1); 
    } 

    desk= dlsym(handle, "Apply"); 

    if ((error = dlerror()) != NULL) { 
     fputs(error, stderr); 
     exit(1); 
    } 

    dlclose(handle); 
} 

Trả lời

181

Bạn phải liên kết chống lại libdl, thêm

-ldl

để lựa chọn mối liên kết của bạn

+2

tôi đã chạy vào cùng một vấn đề ... Tôi đã thêm cờ trình biên dịch trong Project> Properties> C/C++ Build> Settings> (My Linker) > Miscellaneous trong trường Linker flags text. Nó chẳng làm gì cả. – MirroredFate

+3

Ha, ok, cho bất kỳ ai khác có vấn đề này, sử dụng đường dẫn trên, ngoại trừ đi đến Thư viện hơn là Linh tinh và thêm 'dl' – MirroredFate

+1

Câu trả lời này đã giúp. Đối với bất kỳ ai muốn tìm vị trí của libdl.so, chỉ cần vào thư mục gốc và gõ 'locate libdl.so' – Nav

2

Bạn cần phải làm một cái gì đó như thế này cho các makefile:

LDFLAGS = '- ldl' hãy cài đặt

Điều đó sẽ vượt qua các cờ của người liên kết từ việc chuyển đến người liên kết. Không quan trọng là makefile được tạo tự động.

1

Tôi đã gặp cùng sự cố ngay cả khi sử dụng -ldl.

Ngoài tùy chọn này, tệp nguồn cần được đặt trước thư viện, xem undefined reference to `dlopen'.

40

@Masci là đúng, nhưng trong trường hợp bạn đang sử dụng C (và gcc biên dịch) có trong tài khoản rằng điều này không làm việc:

Nhưng điều này không:

gcc dlopentest.c -ldl 

Hãy cho tôi một chút để tìm ra ...

+4

Đó là một tính năng "khó chịu" chắc chắn ... – User1291

+1

Tôi đã nhận thấy rằng thứ tự các tùy chọn cũng quan trọng. Trên một dự án sử dụng sqlite3, tôi phải đặt -ldl (và -lpthread) sau -lsqlite3. Không biết đó là gì, tôi chắc chắn câu trả lời là có nếu tôi chỉ RTFM. –

+0

Holy crap, đúng vậy! Tôi sẽ không bao giờ đoán rằng việc đặt các tùy chọn đầu tiên (có ý nghĩa hơn với tôi) không hoạt động, trong khi đặt chúng sau đó. Cảm ơn bạn, @knocte! –

5

Chủ đề này khá cũ, nhưng tôi đã vật lộn với cùng một vấn đề ngày hôm nay trong khi biên dịch cegui 0.7.1 (điều kiện tiên quyết openVibe).

Điều gì làm việc cho tôi là được đặt: LDFLAGS="-Wl,--no-as-needed" trong Makefile.

Tôi cũng đã thử -ldl cho LDFLAGS nhưng không có kết quả.

2

bạn có thể thử để thêm video này

LIBS=-ldl CFLAGS=-fno-strict-aliasing 

với các tùy chọn cấu hình

+0

Sử dụng biến LIBS làm việc cho tôi để có được cấu hình để đặt -ldl ở đúng nơi trên dòng lệnh. – duncan

1

Để sử dụng chức năng dl bạn cần phải sử dụng cờ -ldl cho mối liên kết.

cách bạn thực hiện trong nhật thực?

Press Project -->Properties -->C/C++ build -->Settings -->GCC C++ Linker -->
Libraries --> in the "Libraries(-l)" box press the "+" sign --> write "dl" (without the quotes)-> press ok -->clean & rebuild your project.

1
$gcc -o program program.c -l <library_to_resolve_program.c's_unresolved_symbols> 

A good description of why the placement of -l dl matters

Nhưng đó cũng là một lời giải thích khá ngắn gọn trong các tài liệu Từ $ man gcc

-llibrary 
    -l library 
     Search the library named library when linking. (The second 
     alternative with the library as a separate argument is only for POSIX 
     compliance and is not recommended.) 
 It makes a difference where in the command you write this option; the 
     linker searches and processes libraries and object files in the order 
     they are specified. Thus, foo.o -lz bar.o searches library z after 
     file foo.o but before bar.o. If bar.o refers to functions in z, 
     those functions may not be loaded. 
Các vấn đề liên quan