gccのかわりにclangを使ってみる
clangの場合、ライブラリ系がどうな感じになるか気になったので調べてみた。
ubuntu環境にclangをインストールする。
sudo apt-get install clang
標準Cライブラリを使うようなCプログラムをgccとclangでコンパイルしてみる。
#include <stdio.h> #include <string.h> int main(int argc, char* argv[]){ const char *hello = "hello"; char buff[128]; memset(buff, 0, sizeof(buff)); sprintf(buff, "%s,%s.", hello, argv[1]); printf("%s\n", buff); return 0; }
$ gcc -o hello_by_gcc hello.c $ clang -o hello_by_clang hello.c
サイズを比べてみる。ちょっとだけちがう。
$ ls -al hello_* -rwxrwxr-x 1 8647 Apr 1 00:50 hello_by_clang -rwxrwxr-x 1 8871 Apr 1 00:47 hello_by_gcc
リンクされている標準ライブラリを見てみる。どちらも同じ。glibc。clang独自で標準Cライブラリを持っているわけではないらしい。
$ ldd hello_by_gcc linux-vdso.so.1 => (0x00007fff40b3e000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5c5c0e2000) /lib64/ld-linux-x86-64.so.2 (0x00007f5c5c4b1000) $ ldd hello_by_clang linux-vdso.so.1 => (0x00007fff1cbff000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0bafa33000) /lib64/ld-linux-x86-64.so.2 (0x00007f0bafe02000)
C++でも試したみたが、参照する標準C++ライブラリも一緒。
#include <iostream> using namespace std; int main(int argc, char* argv[]) { cout << "Hello, " << argv[1] << endl; return 0; }
$ g++ -o hello_cpp_by_g++ ./hello.cpp $ clang++ -o hello_cpp_by_clang++ ./hello.cpp $ ldd ./hello_cpp_by_g++ linux-vdso.so.1 => (0x00007fff4a7ff000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8b56237000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b55e77000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8b55b7a000) /lib64/ld-linux-x86-64.so.2 (0x00007f8b56549000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8b55964000) $ ldd ./hello_cpp_by_clang++ linux-vdso.so.1 => (0x00007fff9892e000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f82ec798000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f82ec3d8000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f82ec0db000) /lib64/ld-linux-x86-64.so.2 (0x00007f82ecaaa000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f82ebec5000)