タグ

関連タグで絞り込む (0)

  • 関連タグはありません

タグの絞り込みを解除

c++とgnuに関するnfunatoのブックマーク (2)

  • C++のマングルとextern "C" { - wagavulin's blog

    C++とCが混在したプログラムを書くとときどき定義したはずの関数がundefinedだと言われることがある。そんなときの対処法とマングルの話。 その前にまずはC言語だけの場合を考える。例えば以下のようなCのプログラムを書いてみる。 /* main.c */ #include "foo.h" int main(){ func1(); return 0; } /* foo.h */ #ifndef FOO_H void func1(); #endif /* foo.c */ #include "foo.h" #include <stdio.h> void func1(){ puts("ok"); } 見てのとおり、main.cはfunc1関数を呼び出しており、foo.cはfunc1関数を定義している。当然、main.cをコンパイルしてできたmain.oもfunc1を参照し、foo.cをコンパイ

    C++のマングルとextern "C" { - wagavulin's blog
  • libdl.soの問題点 - kuenishi's blog

    g++で作ったダイナミックライブラリはdlopen(2)で呼び出すことはできても、dlsym(2)で正常な関数ポインタを作ることができない。g++で作った関数は妙な名前にマングルされているためである。 これを解決するためには、extern "C"でシンボル名をマングルされないようにしなければならない(ccでコンパイルしたときのシンボル名になる)。これで、適当なオブジェクト型を返すような関数をロードする側が前もって知っておくことができれば、g++で作ったライブラリもダイナミックに呼び出すことができる。 ちょっとgcc触った人なら常識かもしれないけど、これを理解するのに一日かかりましたが何か?

    libdl.soの問題点 - kuenishi's blog
  • 1