東京都豊島区
福岡県福岡市
富山県富山市
奈良県上北山村
#include <iostream> #include <memory> using namespace std; struct hoge { hoge() { cout << "a hoge instance is constructed" << endl; } ~hoge() { cout << "a hoge instance is destructed" << endl; } void doSomething() { cout << "a hoge instance does something" << endl; } }; int main(int argc, char **argv) { cout << "start block" << endl; { unique_ptr<hoge> ptr(new hoge()); ptr->doSomething(); } cout << "end block" << endl; return 0; }実行すると、
int main(int argc, char **argv) { unique_ptr<hoge> ptr(new hoge()); unique_ptr<hoge> qtr = ptr; return 0; }
int main(int argc, char **argv) { shared_ptr<hoge> ptr; cout << "start block" << endl; { shared_ptr<hoge> qtr(new hoge()); ptr = qtr; qtr->doSomething(); } cout << "end block" << endl; return 0; }実行結果は以下のようになります。
int main(int argc, char **argv) { weak_ptr<hoge> ptr; cout << "start block" << endl; { shared_ptr<hoge> qtr(new hoge()); ptr = qtr; cout << ptr.use_count() << endl; qtr->doSomething(); } cout << "end block" << endl; return 0; }を実行すると、
#include <iostream> using namespace std; struct animal { virtual void greet() { cout << "Hello, I'm an animal." << endl; } }; struct dog : animal { void greet() { cout << "Hello, I'm a dog." << endl; } }; struct cat : animal { void greet() { cout << "Hello, I'm a cat." << endl; } }; int main(int argc, char **argv) { animal *p = NULL; p = new dog; p->greet(); delete p; p = new cat; p->greet(); delete p; return 0; }上のコードを実行すると、
Hello, I'm a dog. Hello, I'm a cat.のようになる。
Hello, I'm an animal. Hello, I'm an animal.となってしまう。
kenjih$ ./bootstrap.sh --prefix=/home/kenjih/local kenjih$ ./b2 install
#include <iostream> #include <string> #include <boost/multiprecision/cpp_int.hpp> using namespace std; typedef boost::multiprecision::cpp_int bigint; int main() { bigint a, b; cin >> a >> b; cout << a * b << endl; return 0; }コンパイルするときは、以下のようにheaderの検索パスを指定します。
kenjih$ g++ -o test -I ~/local/include test.cpp
#include <iostream> #include <string> #include <boost/multiprecision/cpp_int.hpp> using namespace std; typedef boost::multiprecision::cpp_int bigint; int main() { bigint x(0), y(1); for (int i = 0; i < 100; i++) { cout << x << endl; y = y+x; x = y-x; } return 0; }
#include <iostream> #include <string> #include <boost/multiprecision/cpp_int.hpp> using namespace std; typedef boost::multiprecision::cpp_int bigint; int main() { bigint x, y, b(1); cin >> x; while (x > 0) { if (x & 1) y |= b; x >>= 1; b <<= 1; } cout << y << endl; return 0; }
kenjih$ gcc -c add.c kenjih$ gcc -c sub.c kenjih$ gcc -c mul.c kenjih$ gcc -c div.c kenjih$ ar -q -v libhoge.a *.oのようにして静的ライブラリを作成します。
kenjih$ gcc -o main main.c -L. -lhoge-Lはライブラリの検索パスの指定です。libhoge.aがカレントディレクトリにある場合は、-L.のようにします。
kenjih$ gcc -c -fPIC add.c kenjih$ gcc -c -fPIC sub.c kenjih$ gcc -c -fPIC mul.c kenjih$ gcc -c -fPIC div.c kenjih$ gcc *.o -shared -o libhoge.soのようにして動的ライブラリを作成することができます。
kenjih$ gcc -o main main.c -L. -lhogeコンパイルは静的ライブラリにリンクするときと同様です。gccのリンカは-lxxxと指定されたとき、まずlibxxx.soを探してあればそれをリンクします。libxxx.soが無ければlibxxx.aを探してそれをリンクします。
kenjih$ ldd main linux-gate.so.1 => (0xb77af000) libhoge.so => not found libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75ea000) /lib/ld-linux.so.2 (0xb77b0000)libhoge.soがnot foundとなっています。これはlibhoge.soがデフォルトのライブラリ検索パス内に存在しないからです。libhoge.soを適切なパスに移動させてもいいですが、環境変数LD_LIBRARY_PATHに動的ライブラリのパスを指定することも出来ます。
export LD_LIBRARY_PATH=$(pwd)を実行して、libhoge.soファイルがあるカレントディレクトリをLD_LIBRARY_PATHに指定します。
kenjih$ ldd main linux-gate.so.1 => (0xb771c000) libhoge.so => /home/kenjih/programming/cpp/sample2/dynamic/libhoge.so (0xb7717000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7554000) /lib/ld-linux.so.2 (0xb771d000)で作成した動的ライブラリの場所が認識されたことが分かります。./mainを実行すると、libhoge.soが動的にリンクされます。
$ gcc --print-search-dirs
$ ar -t `locate libm.a | head -n 1` k_standard.o s_lib_version.o s_matherr.o s_signgam.o .....
$ ar -q -v libhoge.a *.o a - add.o a - div.o a - mul.o a - sub.o
#include <stdio.h> int main() { int a, b; a = 10; b = 2; printf("%d + %d = %d\n", a, b, add(a, b)); printf("%d - %d = %d\n", a, b, sub(a, b)); printf("%d * %d = %d\n", a, b, mul(a, b)); printf("%d / %d = %d\n", a, b, div(a, b)); return 0; }で、コンパイルします。
$ gcc main.c -L. -lhoge -o test
$ sudo netstat -tanp | grep mysql-t: TCPのみ
$ sudo lsof -c mysql -a -i -a -P-c: プロセス名を指定
$ sudo lsof -i:3306
$ locate httpd.conflocateはディスク上のファイルではなく、DBに格納されたファイルパス情報を検索している。 DBはupdatedbというコマンドで最新化できる。updatedbはcronに登録されている。
$ factor 123456789
$ display xxx.jpg
$ basename test.cpp .cpp
$ pkg-config --cflags opencv $ pkg-config --libs opencv
$ g++ -ggdb `pkg-config --cflags opencv` -o `basename opencvtest.cpp .cpp` opencvtest.cpp `pkg-config --libs opencv`
$ xdg-open sample.avi $ xdg-open http://yahoo.co.jp上の例では、それぞれビデオファイル、yahooのページをデフォルトのアプリケーションで開きます。
$ lsb_release -a
$ dpkg -l必要に応じて、パイプとgrepで絞り込みを行う。
$ dpkg -l | grep openssl
$ lscpu | grep opCPU op-mode(s): 32-bit, 64-bit のように表示されれば、64bitのオペレーションモードをサポートしていることが分かる。
$ uname -m # uname -p でもOK.x86_64のように表示されれば64bit。ix86のように表示されれば32bit。