次にクラスについても実験。やり方は一緒。
ところが今回はコンパイル時(リンク時?)に
undefined reference to `operator new(unsigned)'
というようなエラーがいくつか出てしまった、ググったところ回避するには-lstdc++オプションを付ければ良いとのことなのでつけたらできました。ただしlibstdc++に依存するバイナリになってしまいました。libstdc++.aがあったのでstaticにリンクしたかったのだけど明示的に指定する方法が良くわからん。zvolの時も同じ問題があったんだけど、あの時は.aなファイルをカレントに持ってきてコンパイルしたらできたのですけど、今回はダメだった。
-
- zvolの時のMakefileの中を調べてみれば良いのかな?
- 解決、10月2日の日記参照
- zvolの時のMakefileの中を調べてみれば良いのかな?
ソースファイルは以下
-----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)