GCC命令行参数的问题(静态库,32/64bit,pthread)
由于对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 能够保持向后兼容,并提高命令行的一致性。
摘自 善良的兽人
补充:软件开发 , C++ ,