Tôi đang cố gắng biên dịch mã ví dụ thư viện DL đơn giản sau đây từ Program-Library-HOWTO bằng g ++. Đây chỉ là một ví dụ để tôi có thể học cách sử dụng và viết các thư viện chia sẻ. Mã thực sự cho thư viện mà tôi đang phát triển sẽ được viết bằng C++.Biên dịch Thư viện Chia sẻ Động với 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);
}
Nếu tôi biên dịch chương trình bằng gcc thì nó hoạt động tốt.
gcc -o foo foo.c -ldl
Khi tôi thay đổi tên tập tin và trình biên dịch như sau
g++ -o foo foo.cpp -ldl
tôi nhận được lỗi sau:
foo.cpp:16: error: invalid conversion from 'void*' to 'double (*)(double)'
Tôi hiểu (I nghĩ tôi hiểu, chính xác cho tôi nếu điều này là sai) mà tôi không thể làm một diễn viên tiềm ẩn từ một con trỏ void trong C + +, nhưng C cho phép tôi, và đây là lý do tại sao các mã trên sẽ biên dịch bằng cách sử dụng gcc nhưng không usin g g ++. Vì vậy, tôi đã cố gắng chuyển kiểu tường minh bằng cách thay đổi dòng 16 trên để:
cosine = (double *)dlsym(handle, "cos");
Với điều này tại chỗ, tôi nhận được thông báo lỗi sau:
foo.cpp:16: error: cannot convert 'double*' to 'double (*)(double)' in assignment
Những vấn đề này có thể có nhiều việc phải làm với sự thiếu hiểu biết chung của riêng tôi của các tiêu chuẩn mã hóa C++ phù hợp hơn bất kỳ thứ gì khác. Bất cứ ai có thể chỉ cho tôi một hướng dẫn tốt về phát triển thư viện động cho Linux có sử dụng mã ví dụ C++?
Tôi khuyên bạn nên thực hiện 'Suy nghĩ trong C++' để tăng tốc độ trên C++. Khi bạn phát hiện chính xác, bạn không thể ẩn hoàn toàn từ void * sang các con trỏ khác trong C++, và điều đó ngụ ý bạn thực sự chỉ cần tăng tốc trên C++ thay vì các vùng khác :) – workmad3
Cảm ơn, tôi đang đọc C++ Primer trong thời gian rảnh rỗi của tôi, nhưng ngay bây giờ tôi có một dự án do. –