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)