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

时间:2022-12-23 09:12:41
闲来无事,敲敲"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. 








7 个解决方案

#1


源文件在最前面就行了,其他顺序无所谓

#2


我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。

#3


对于静态库的链接,有顺序要求的,被调用的函数所在的库必须在调用函数所在的模块或库的后面

http://blog.csdn.net/mymtom/article/details/1674184

#4


-L 目录
-I  目录

L = lib
I = include 

#5


引用 2 楼 zhao4zhong1 的回复:
我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。

我是了一下,吧文件名加上引号也不起作用,只能是把文件名作为第一个参数

#6


引用 5 楼 zxqatqd 的回复:
Quote: 引用 2 楼 zhao4zhong1 的回复:

我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。

我是了一下,吧文件名加上引号也不起作用,只能是把文件名作为第一个参数

两个错别字,"是“ 应为 "试‘, "吧” 应为 "把“

#7


引用 3 楼 mymtom 的回复:
对于静态库的链接,有顺序要求的,被调用的函数所在的库必须在调用函数所在的模块或库的后面

http://blog.csdn.net/mymtom/article/details/1674184

看来的确是这样的,不知道有没有官方说明。
PS,看兄台的头像也是war3爱好者啊,有空切磋切磋。 +q 20789379

#1


源文件在最前面就行了,其他顺序无所谓

#2


我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。

#3


对于静态库的链接,有顺序要求的,被调用的函数所在的库必须在调用函数所在的模块或库的后面

http://blog.csdn.net/mymtom/article/details/1674184

#4


-L 目录
-I  目录

L = lib
I = include 

#5


引用 2 楼 zhao4zhong1 的回复:
我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。

我是了一下,吧文件名加上引号也不起作用,只能是把文件名作为第一个参数

#6


引用 5 楼 zxqatqd 的回复:
Quote: 引用 2 楼 zhao4zhong1 的回复:

我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。

我是了一下,吧文件名加上引号也不起作用,只能是把文件名作为第一个参数

两个错别字,"是“ 应为 "试‘, "吧” 应为 "把“

#7


引用 3 楼 mymtom 的回复:
对于静态库的链接,有顺序要求的,被调用的函数所在的库必须在调用函数所在的模块或库的后面

http://blog.csdn.net/mymtom/article/details/1674184

看来的确是这样的,不知道有没有官方说明。
PS,看兄台的头像也是war3爱好者啊,有空切磋切磋。 +q 20789379