Próbuję skompilować następujący prosty przykładowy kod biblioteki DL z Program-Library-HOWTO z g ++. To tylko przykład, więc mogę się nauczyć obsługiwać i pisać biblioteki współdzielone. Prawdziwy kod biblioteki, którą tworzę, będzie napisany w C++.Kompilacja dynamicznej biblioteki współdzielonej za pomocą g ++
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
}
Jeśli skompiluję program z gcc, działa dobrze.
gcc -o foo foo.c -ldl
Kiedy zmienić nazwę pliku i kompilator następującym
g++ -o foo foo.cpp -ldl
pojawia się następujący błąd:
foo.cpp:16: error: invalid conversion from 'void*' to 'double (*)(double)'
rozumiem (myślę Rozumiem, poprawcie mnie jeśli to jest złe), że nie mogę wykonać niejawnego rzutowania z pustego wskaźnika w C++, ale C pozwala mi, i to dlatego powyższy kod skompiluje używając gcc, ale nie użyje g g ++. Spróbowałem więc wyraźne obsady zmieniając linię 16 powyżej:
cosine = (double *)dlsym(handle, "cos");
Mając to na miejscu, pojawia się następujący błąd: prawdopodobnie
foo.cpp:16: error: cannot convert 'double*' to 'double (*)(double)' in assignment
Te problemy mają więcej wspólnego z moim ogólnym ignorancji prawidłowych standardów kodowania w C++ niż cokolwiek innego. Czy ktoś może wskazać mi dobry tutorial na temat tworzenia dynamicznych bibliotek dla Linuksa, który używa przykładowego kodu C++?
Proponuję przejście przez "Myślenie w C++", aby przyspieszyć działanie C++. Jak poprawnie zauważyłeś, nie możesz niejawnie rzucić z void * na inne wskaźniki w C++, co sugeruje, że naprawdę potrzebujesz tylko przyspieszyć działanie C++, a nie innych obszarów :) – workmad3
Dzięki, czytam C++ Primer w wolnym czasie, ale teraz mam już należny projekt. –