C++のクラスを動的リンクにする方法について
別にライブラリを作るとかいう話ではなく、実行バイナリサイズを小さくするために使いたいというだけ。
いろいろ調べると、クラスのソースをそのまま共有オブジェクトとしてコンパイルすればいけるらしい。
Pow.h
class CPow {
public:
CPow();
CPow(int base);
~CPow();
int Pow(int n);
private:
int m_nBase;
};
Pow.cpp
int CPow::Pow(int n)
{
int num = m_nBase;
while (--n > 0) {
num *= num;
}
return num;
}
Main.cpp
int main(int argc, char **argv)
{
CPow pow(3);
printf("3^2=%d\n", pow.Pow(2));
return 0;
}
Makefile
.PHONY : all
all :
g++ -fPIC -shared -o Pow.so Pow.cpp
g++ Main.o -o test Pow.so
処理内容については不問で。。。
Pow.soを/usr/libにおいてldconfigしてからlddすると、
Pow.so => /usr/lib/Pow.so (0x4002b000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x4002d000)
libm.so.6 => /lib/tls/libm.so.6 (0x400e0000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40102000)
libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
となっていて、実行バイナリからクラスの排除に成功
当然実行すれば、
# ./test
3^2=9
となる
あとは、実行速度とかを実際にバイナリサイズがでかくなったときに比較すればいいのかなぁ??
最終更新:2007年02月22日 18:58