gcc -l选项必须放在文件名后面吗?关于apue中libapue的问题

zxqatqd 2015-10-09 04:34:52
闲来无事,敲敲"apue"上的code, 发现了一个奇怪的问题。事先已经把apue.h的源代码从网上download并make之后将生产的libapue.a以及apue.h分别copy到了/usr/lib和/use/include中了。 代码是实例8-1,贴上吧,尽管问题与code 无关,命名8.1.c
#include "apue.h"

int glob = 6; /*external variable in initialized data */
char buf[] = " a wirte to stdout\n";

int main(void){
int var; /*automatic var on statck*/
pid_t pid;

var = 88;
if( write( STDOUT_FILENO, buf, sizeof(buf) -1 ) != sizeof(buf) -1 )
err_sys( "write error" );
printf( "before fork\n" ); /* donot flush stdout */

if(( pid = fork()) < 0 ){
err_sys( "fork error");
}else if( pid == 0) { /*child*/
glob++;
var++;
}else{
sleep(2);
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var );
exit(0);
}

敲写完毕,开始编译,问题出来了.
[oliver@AY1305141850350384fbZ myapue.3e]$ gcc -o 8.1 -l apue 8.1.c
/tmp/ccp4GstY.o: In function `main':
8.1.c:(.text+0x37): undefined reference to `err_sys'
8.1.c:(.text+0x5e): undefined reference to `err_sys'
collect2: ld returned 1 exit status
[oliver@AY1305141850350384fbZ myapue.3e]$

有链接错误啊,怎么回事?急得我百抓挠心,明明是吧libapue.a拷到系统目录下了,怎么还会找不到啊啊啊啊啊
偶然之下,我换了一下gcc命令的选项顺序,
[oliver@AY1305141850350384fbZ myapue.3e]$ gcc 8.1.c -l apue -o 8.1
[oliver@AY1305141850350384fbZ myapue.3e]$ ls
11.2.c 14.1.c 8.1 8.1.c

咦,8.1出现了!!!!!
我又换了几次,发现只要 8.1.c 出现在-l apue之前,编译就能成功,出现在后面,必定会出现链接失败。

难道gcc -l这个选项有位置的要求吗?
我的gcc版本如下
[oliver@AY1305141850350384fbZ myapue.3e]$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


自己没有时间也没有能力去深究gcc了,发个贴子请教一下高手,以及提醒一下学习apue的童鞋,在敲code的时候,如何正确使用libapue.a.








...全文
297 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxqatqd 2015-12-17
  • 打赏
  • 举报
回复
引用 3 楼 mymtom 的回复:
对于静态库的链接,有顺序要求的,被调用的函数所在的库必须在调用函数所在的模块或库的后面 http://blog.csdn.net/mymtom/article/details/1674184
看来的确是这样的,不知道有没有官方说明。 PS,看兄台的头像也是war3爱好者啊,有空切磋切磋。 +q 20789379
zxqatqd 2015-12-17
  • 打赏
  • 举报
回复
引用 5 楼 zxqatqd 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:] 我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。 试试将文件名用半角双引号括住或将文件名作为第一个参数。
我是了一下,吧文件名加上引号也不起作用,只能是把文件名作为第一个参数[/quote] 两个错别字,"是“ 应为 "试‘, "吧” 应为 "把“
zxqatqd 2015-12-17
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。 试试将文件名用半角双引号括住或将文件名作为第一个参数。
我是了一下,吧文件名加上引号也不起作用,只能是把文件名作为第一个参数
xiaoshang_program 2015-10-17
  • 打赏
  • 举报
回复
-L 目录 -I 目录 L = lib I = include
mymtom 2015-10-14
  • 打赏
  • 举报
回复
对于静态库的链接,有顺序要求的,被调用的函数所在的库必须在调用函数所在的模块或库的后面 http://blog.csdn.net/mymtom/article/details/1674184
赵4老师 2015-10-13
  • 打赏
  • 举报
回复
我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。
大大大白 2015-10-13
  • 打赏
  • 举报
回复
源文件在最前面就行了,其他顺序无所谓

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧