#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的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。
试试将文件名用半角双引号括住或将文件名作为第一个参数。
#4
-L 目录
-I 目录
L = lib
I = include
-I 目录
L = lib
I = include
#5
我是了一下,吧文件名加上引号也不起作用,只能是把文件名作为第一个参数
#6
两个错别字,"是“ 应为 "试‘, "吧” 应为 "把“
#7
对于静态库的链接,有顺序要求的,被调用的函数所在的库必须在调用函数所在的模块或库的后面
http://blog.csdn.net/mymtom/article/details/1674184
看来的确是这样的,不知道有没有官方说明。
PS,看兄台的头像也是war3爱好者啊,有空切磋切磋。 +q 20789379
#1
源文件在最前面就行了,其他顺序无所谓
#2
我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。
试试将文件名用半角双引号括住或将文件名作为第一个参数。
#3
#4
-L 目录
-I 目录
L = lib
I = include
-I 目录
L = lib
I = include
#5
我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。
我是了一下,吧文件名加上引号也不起作用,只能是把文件名作为第一个参数
#6
我以前遇到过很多次当文件名以数字开头时,被命令行程序解析为option而非filename的意外情况。
试试将文件名用半角双引号括住或将文件名作为第一个参数。
我是了一下,吧文件名加上引号也不起作用,只能是把文件名作为第一个参数
两个错别字,"是“ 应为 "试‘, "吧” 应为 "把“
#7
对于静态库的链接,有顺序要求的,被调用的函数所在的库必须在调用函数所在的模块或库的后面
http://blog.csdn.net/mymtom/article/details/1674184
看来的确是这样的,不知道有没有官方说明。
PS,看兄台的头像也是war3爱好者啊,有空切磋切磋。 +q 20789379