由於對GCC的參數一知半解,害我今天早上浪費了一個多小時。“以此文祭奠失去的時間”
1、生成靜態鏈接庫:
分兩步
g++ -c aaa.cpp
ar -rsv libaaa.a aaa.o
gcc默認要求庫文件名必須是lib[名稱].a的形式,動態鏈接庫類似是.so
2、怎麼用這個libaaa.a,有兩種辦法
g++ main.c -L"PATH_TO_AAA" -laaa
或者
g++ main.c libaaa.a
前者在使用靜態庫時候比較常見,最重要的是,-L和-l參數必須在源文件之後指定!我今天不知道這個問題,瞎試了半天。我猜這種規定有助於對不同的源文件指定不同的庫,比較清晰。
3、64位系統加參數-m64
怎們看自己的系統是不是64位呢?
$su - root
#file /sbin/init
/sbin/init: ELF <b>;32-bit</b>; LSB executable, Intel 80386......
按字面上寫的就對了
4、Linux的線程庫
POSIX標准線程庫pthread,如果工程裡用到多線程庫就需要注意gcc的參數,有些時候-lpthread會失敗,比如RakNet,這時必須用-pthread。
-pthread和-lpthread的區別在網上可以搜到
$ gcc -v -c x.c
...
/usr/lib/gcc/i486-linux-gnu/4.2.4/cc1 -quiet -v x.c -quiet -dumpbase x.c
$ gcc -v -pthread -c x.c
...
/usr/lib/gcc/i486-linux-gnu/4.2.4/cc1 -quiet -v -D_REENTRANT
可見編譯選項中指定 -pthread 會附加一個宏定義-D_REENTRANT,該宏會導致 libc 頭文件選擇那些thread-safe的實現;鏈接選項中指定 -pthread 則同 -lpthread 一樣,只表示鏈接 POSIX thread 庫。由於 libc 用於適應 thread-safe 的宏定義可能變化,因此在編譯和鏈接時都使用 -pthread 選項而不是傳統的 -lpthread 能夠保持向後兼容,並提高命令行的一致性。