hakeの日記

Windows環境でプログラミングの勉強をしています。

共有ライブラリの作成 その2

次にクラスについても実験。やり方は一緒。
ところが今回はコンパイル時(リンク時?)に

undefined reference to `operator new(unsigned)'

というようなエラーがいくつか出てしまった、ググったところ回避するには-lstdc++オプションを付ければ良いとのことなのでつけたらできました。ただしlibstdc++に依存するバイナリになってしまいました。libstdc++.aがあったのでstaticにリンクしたかったのだけど明示的に指定する方法が良くわからん。zvolの時も同じ問題があったんだけど、あの時は.aなファイルをカレントに持ってきてコンパイルしたらできたのですけど、今回はダメだった。

    • zvolの時のMakefileの中を調べてみれば良いのかな?
      • 解決、10月2日の日記参照

ソースファイルは以下

-----main.cpp
#include <stdio.h>
#include "calc.h"

int main()
{
	int a = 3;
	int b = 2;
	int c;

	Calc *calc = new Calc();
	c = calc->add(a, b);
	printf("%d + %d = %d\n", a, b, c);
	c = calc->sub(a, b);
	printf("%d - %d = %d\n", a, b, c);

	return(0);
}

-----calc.h
#ifndef CALC_H
#define CALC_H

class Calc
{
public:
	Calc();
	~Calc();

	int add(int a, int b);
	int sub(int a, int b);
};

#endif

-----calc.cpp
#include "calc.h"

Calc::Calc()
{}

Calc::~Calc()
{}

int Calc::add(int a, int b){
	return a + b;
}

int Calc::sub(int a, int b){
	return a - b;
}


$ gcc -lstdc++ main.cpp calc.cpp
$ gcc -fPIC -c calc.cpp                       
$ gcc -shared -Wl,-soname,libcalc.so.1 -o libcalc.so.1 calc.o  libcalc.so.1ができる
$ cp libcalc.so.1 libcalc.so

$ gcc -L. -lcalc -lstdc++ main.cpp
  • ldd a.outの出力
	libcalc.so.1 => ./libcalc.so.1 (0x40022000)
	libstdc++.so.6 => /opt/zgcc42/lib/libstdc++.so.6 (0x4002b000)
	libgcc_s.so.1 => /opt/zgcc42/lib/libgcc_s.so.1 (0x4011f000)
	libc.so.6 => /lib/libc.so.6 (0x4012f000)
	libm.so.6 => /lib/libm.so.6 (0x4024a000)
	/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)