我想用g ++編譯以下簡單的DL庫示例代碼Program-Library-HOWTO。這只是一個例子,所以我可以學習如何使用和編寫共享庫。我正在開發的庫的真實代碼將用C++編寫。使用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);
}
如果我用gcc編譯程序,它工作正常。
gcc -o foo foo.c -ldl
當我更改文件名和編譯器下面
g++ -o foo foo.cpp -ldl
我收到以下錯誤:
foo.cpp:16: error: invalid conversion from 'void*' to 'double (*)(double)'
我瞭解(我認爲我明白,如果指正這是錯誤的),我不能在C++中使用void指針進行隱式轉換,但C讓我,這就是爲什麼上面的代碼將使用gcc編譯而不是使用usin g g ++。因此,我通過改變上述行16試過一個顯式的:
cosine = (double *)dlsym(handle, "cos");
有了這個地方,我得到以下錯誤:
foo.cpp:16: error: cannot convert 'double*' to 'double (*)(double)' in assignment
這些問題可能有更多的事情要做我自己一般的無知適當的C++編碼標準。任何人都可以點我一個關於開發使用C++示例代碼的Linux動態庫的好教程嗎?
我建議通過「在C++中思考」來加快C++的速度。正如你正確的發現,你不能隱式地從void *轉換到C++中的其他指針,這意味着你真的只需要在C++而不是其他區域上加快速度:) – workmad3 2009-01-27 15:34:14
謝謝,我正在閱讀C++ Primer在業餘時間,但現在我有一個項目到期。 – 2009-01-27 15:36:12