GCC命令行参数的问题(静态库,32/64bit,pthread)

本文介绍了GCC编译器的基本用法,包括如何生成静态链接库、如何正确使用静态库进行链接,以及在64位系统下编译的注意事项。此外还详细解释了-pthread与-lpthread的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        由于对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的区别在网上可以搜到http://space.itpub.net/7232789/viewspace-688917

$ 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 能够保持向后兼容,并提高命令行的一致性。


for F in cyclictest hackbench pip_stress pi_stress pmqtest ptsematest rt-migrate-test signaltest sigwaittest svsematest cyclicdeadline deadline_test queuelat ssdd oslat *.o .depend *.*~ *.orig *.rej *.d *.a *.8.gz *.8.bz2 ; do find -type f -name $F | xargs rm -f; done rm -f rt-tests-*.tar rm -f hwlatdetect rm -f get_cyclictest_snapshot rm -f tags gcc -D VERSION=2.6 -c src/cyclictest/cyclictest.c -Wall -Wno-nonnull -Wextra -O2 -g -D_GNU_SOURCE -Isrc/include -o bld/cyclictest.o src/cyclictest/cyclictest.c: 在函数‘timerthread’中: src/cyclictest/cyclictest.c:744:12: 警告:comparison of integer expressions of different signedness: ‘uint64_t’ {或称 ‘long unsigned int’} and ‘long int’ [-Wsign-compare] if (diff < stat->min) ^ src/cyclictest/cyclictest.c:746:12: 警告:comparison of integer expressions of different signedness: ‘uint64_t’ {或称 ‘long unsigned int’} and ‘long int’ [-Wsign-compare] if (diff > stat->max) { ^ src/cyclictest/cyclictest.c:753:24: 警告:comparison of integer expressions of different signedness: ‘uint64_t’ {或称 ‘long unsigned int’} and ‘int’ [-Wsign-compare] if (trigger && (diff > trigger)) ^ src/cyclictest/cyclictest.c:759:39: 警告:comparison of integer expressions of different signedness: ‘uint64_t’ {或称 ‘long unsigned int’} and ‘int’ [-Wsign-compare] if (!stopped && tracelimit && (diff > tracelimit)) { ^ src/cyclictest/cyclictest.c:781:13: 警告:comparison of integer expressions of different signedness: ‘uint64_t’ {或称 ‘long unsigned int’} and ‘int’ [-Wsign-compare] if (diff >= histogram) { ^~ src/cyclictest/cyclictest.c: 在函数‘process_options’中: src/cyclictest/cyclictest.c:1288:31: 警告:comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Wsign-compare] if (clocksel < 0 || clocksel > ARRAY_SIZE(clocksources)) ^ src/cyclictest/cyclictest.c: 在函数‘print_hist’中: src/cyclictest/cyclictest.c:1465:26: 警告:comparison of integer expressions of different signedness: ‘long int’ and ‘long unsigned int’ [-Wsign-compare] if (par[j]->stats->max > maxmax) ^ src/cyclictest/cyclictest.c: 在函数‘main’中: src/cyclictest/cyclictest.c:2183:44: 警告:comparison of integer expressions of different signedness: ‘long unsigned int’ and ‘int’ [-Wsign-compare] if (max_cycles && statistics[i]->cycles >= max_cycles) ^~ gcc -D VERSION=2.6 -c src/lib/rt-error.c -Wall -Wno-nonnull -Wextra -O2 -g -D_GNU_SOURCE -Isrc/include -o bld/rt-error.o gcc -D VERSION=2.6 -c src/lib/rt-get_cpu.c -Wall -Wno-nonnull -Wextra -O2 -g -D_GNU_SOURCE -Isrc/include -o bld/rt-get_cpu.o gcc -D VERSION=2.6 -c src/lib/rt-sched.c -Wall -Wno-nonnull -Wextra -O2 -g -D_GNU_SOURCE -Isrc/include -o bld/rt-sched.o gcc -D VERSION=2.6 -c src/lib/rt-utils.c -Wall -Wno-nonnull -Wextra -O2 -g -D_GNU_SOURCE -Isrc/include -o bld/rt-utils.o ar rcs bld/librttest.a bld/rt-error.o bld/rt-get_cpu.o bld/rt-sched.o bld/rt-utils.o ar: /usr/bin/../bin/../lib/bfd-plugins/LLVMgold.so: ELF 类不对:ELFCLASS32 gcc -D VERSION=2.6 -c src/lib/rt-numa.c -Wall -Wno-nonnull -Wextra -O2 -g -D_GNU_SOURCE -Isrc/include -o bld/rt-numa.o ar rcs bld/librttestnuma.a bld/rt-numa.o ar: /usr/bin/../bin/../lib/bfd-plugins/LLVMgold.so: ELF 类不对:ELFCLASS32 gcc -Wall -Wno-nonnull -Wextra -O2 -g -static -o cyclictest bld/cyclictest.o -lrt -lpthread -lrttest -Lbld -lrttestnuma -lnuma /usr/bin/ld: 找不到 -lrt /usr/bin/ld: 找不到 -lpthread /usr/bin/ld: 找��到 -lnuma /usr/bin/ld: ��不到 -lc collect2: 错误:ld 返回 1 make: *** [Makefile:122:cyclictest] 错误 1
最新发布
03-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值