C++から動的に読み込まれたSharedObjectを利用する の続編だぜ。というかこっちが本題だ。Shared ObjectからC++をC++らしく使いたい。
要点
- C++の機能をまともに使うなら extern "C" で逃げるのは不可能。同じコンパイラで全部コンパイルすれば問題ないようだ。
- -fPIC オプション付けろと怒られたので付けた。(Shared ObjectってのはどのみちPosition-Independent Codeじゃねえのか?)
実装
main.cxxはC++から動的に読み込まれたSharedObjectを利用すると同じだから省略するぜ。
Messenger.h
class Messenger
{
private:
const char * message;
public:
Messenger(const char * message);
virtual ~Messenger();
void say();
};
Messenger.cxx
#include <stdio.h>
#include "Messenger.h"
Messenger::Messenger(const char * message) : message(message)
{
}
Messenger::~Messenger()
{
printf("Bye!\n");
}
void Messenger::say()
{
printf("%s!\n", message);
}
French.cxx
#include "Messenger.h"
extern "C"
{
void hello();
}
void hello()
{
Messenger m("Bonjour");
m.say();
}
Makefile
run: main.exe libFrench.so
LD_LIBRARY_PATH=. ./main.exe libFrench.so
main.exe: main.cxx
clang++ -o main.exe main.cxx -ldl
libFrench.so: French.cxx libMessenger.so
clang++ -shared -fPIC -o libFrench.so French.cxx -L. -lMessenger
libMessenger.so: Messenger.cxx
clang++ -shared -fPIC -o libMessenger.so Messenger.cxx
clean:
rm -rf *.exe *.o *.so