Pracuję w Linuksie z C ++ (Eclipse) i chcę korzystać z biblioteki. Eclipse pokazuje mi błąd:
undefined reference to 'dlopen'
Czy znasz rozwiązanie?
Oto mój kod:
#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);
}
locate libdl.so
@Masci jest poprawne, ale jeśli używasz C (i
gcc
kompilatora), weź pod uwagę, że to nie działa:Ale to robi:
Trochę mi zajęło, żeby się zorientować ...
źródło
Temat jest dość stary, ale walczyłem z tym samym problemem dzisiaj podczas kompilacji cegui 0.7.1 (warunek wstępny openVibe).
U mnie zadziałało ustawienie:
LDFLAGS="-Wl,--no-as-needed"
w pliku Makefile.Próbowałem zostały również
-ldl
dlaLDFLAGS
ale bezskutecznie.źródło
Miałem z tym problem podczas pisania składni heredoc i znalazłem kilka interesujących faktów . Ze
CC=Clang
to działa:a także wszystkie te:
$CC -ldl -x c -o app.exe - << EOF
$CC -x c -ldl -o app.exe - << EOF
$CC -x c -o app.exe -ldl - << EOF
$CC -x c -o app.exe - -ldl << EOF
Jednak
CC=gcc
działa tylko ostatni wariant;-ldl
po-
(symbol argumentu stdin).źródło
możesz spróbować to dodać
do opcji konfiguracyjnych
źródło
Używałem CMake do kompilacji mojego projektu i napotkałem ten sam problem.
Rozwiązanie opisane tutaj działa jak urok, po prostu dodaj $ {CMAKE_DL_LIBS} do wywołania target_link_libraries ()
źródło
SET(CMAKE_CXX_COMPILER /usr/bin/clang++)
. Z / usr / bin / c ++ na moim Ubuntu to nie działało ... (zobacz także odpowiedź Vulcan Raven)Musiałeś zrobić coś takiego dla makefile:
Spowoduje to przekazanie flag konsolidatora od producenta do konsolidatora. Nie ma znaczenia, że plik makefile został wygenerowany automatycznie.
źródło
Napotkałem ten sam problem, nawet używając
-ldl
.Poza tą opcją, pliki źródłowe muszą być umieszczane przed bibliotekami, zobacz niezdefiniowane odniesienie do `dlopen ' .
źródło
Aby użyć funkcji dl, musisz użyć opcji -ldl dla konsolidatora.
jak to robisz w zaćmieniu?
źródło
Dobry opis, dlaczego położenie -l dl ma znaczenie
Ale jest też dość zwięzłe wyjaśnienie w dokumentach From $ man gcc
źródło