Program-Library-HOWTOの次の簡単な DL ライブラリのサンプル コードを g++ でコンパイルしようとしています。これは単なる例であるため、共有ライブラリの使用方法と作成方法を学ぶことができます。私が開発しているライブラリの実際のコードは、C++ で記述されます。
#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: エラー: 'void*' から 'double (*)(double)' への変換が無効です
C ++ではvoidポインターから暗黙のキャストを実行できないことを理解しています(理解したと思います、これが間違っている場合は修正してください)が、Cでは許可されています。これが、上記のコードがgccを使用してコンパイルするが、使用しない理由ですg++. そこで、上記の 16 行目を次のように変更して、明示的なキャストを試みました。
cosine = (double *)dlsym(handle, "cos");
これを行うと、次のエラーが表示されます。
foo.cpp:16: エラー: 代入で 'double*' を 'double (*)(double)' に変換できません
これらの問題は、他の何よりも、適切な C++ コーディング標準に対する私自身の一般的な無知に関係している可能性があります。C++ のサンプル コードを使用する Linux 用の動的ライブラリの開発に関する優れたチュートリアルを教えてくれる人はいますか?