威尼斯人线上娱乐

【威尼斯人线上娱乐】从零开首UNIX碰着高端编制程序,UNIX情状高档编制程序

22 10月 , 2019  

APUE整本书中都有那般一条 include “apue.h” 预管理语句~

0. 准备

UNIX意况高端编制程序(简单的称呼APUE)书中须求接纳cc举行编写翻译。
Linux上举办cc对应调用的仍旧gcc,所以倘使安装了gcc,就可见编写翻译。验证进程如下:

root@ubuntu:/home/ckt/work/unix/code# which cc
/usr/bin/cc
root@ubuntu:/home/ckt/work/unix/code# ls -al /usr/bin/cc
lrwxrwxrwx 1 root root 20 Nov 26  2014 /usr/bin/cc -> /etc/alternatives/cc
root@ubuntu:/home/ckt/work/unix/code# ls -al /etc/alternatives/cc
lrwxrwxrwx 1 root root 12 Nov 26  2014 /etc/alternatives/cc -> /usr/bin/gcc

《UNIX情状高端编制程序》multiple definition of `err_sys’,errsys

正文地址:

 

标题陈说:

[点击这里直接看施工方案]

在演习《UNIX情状高端编制程序》APUE程序清单8-7的时候,codelist8-7.c中用到了codelist15-3.c中的函数TELL_WAIT(),WAIT_PARENT()及TELL_CHILD()。

codelist8-7.c:

威尼斯人线上娱乐 1 1
#include “apue.h” 2 3 static void charatatime(char *); 4 5 int
main(void) 6 { 7 pid_t pid; 8 TELL_WAIT(); 9 10 if ((pid = fork())
< 0) { 11 err_sys(“fork error”); 12 } else if (pid == 0) { 13
WAIT_PARENT(); /* parent goes first */ 14 charatatime(“output from
child\n”); 15 } else { 16 charatatime(“output from parent\n”); 17
TELL_CHILD(pid); 18 } 19 exit(0); 20 } 21 22 static void
charatatime(char *str) 23 { 24 char *ptr; 25 int c; 26 27
setbuf(stdout, NULL); /* set unbuffered */ 28 for (ptr = str; (c =
*ptr++) != 0; ) 29 putc(c, stdout); 30 } codelist8-7.c

codelist15-3.c:

威尼斯人线上娱乐 2 1
#include “apue.h” 2 3 static int pfd1[2], pfd2[2]; 4 5 void
TELL_WAIT(void) 6 { 7 if (pipe(pfd1) < 0 || pipe(pfd2) < 0) 8
err_sys(“pipe error”); 9 } 10 11 void TELL_PARENT(pid_t pid) 12 { 13
if (write(pfd2[1], “c”, 1) != 1) 14 err_sys(“write error”); 15 } 16
17 void WAIT_PARENT(void) 18 { 19 char c; 20 21 if (read(pfd1[0], &c,
1) != 1) 22 err_sys(“read error”); 23 24 if (c != ‘p’) 25
err_quit(“WAIT_PARENT: incorrect data”); 26 } 27 28 void
TELL_CHILD(pid_t pid) 29 { 30 if (write(pfd1[1], “p”, 1) != 1) 31
err_sys(“write error”); 32 } 33 34 void WAIT_CHILD(void) 35 { 36 char
c; 37 38 if (read(pfd2[0]威尼斯人线上娱乐,, &c, 1) 【威尼斯人线上娱乐】从零开首UNIX碰着高端编制程序,UNIX情状高档编制程序。!= 1) 39 err_sys(“read error”); 40
41 if (c != ‘c’) 42 err_quit(“WAIT_CHILD: incorrect data”); 43 } View Code

在应用命令编写翻译8-7时,提醒以下错误:

$ gcc codelist8-7.c codelist15-3.c -o 8-7
/tmp/ccMDAwpv.o: In function `err_ret':
codelist15-3.c:(.text+0x0): multiple definition of `err_ret'
/tmp/ccXi2EPL.o:codelist8-7.c:(.text+0x0): first defined here
/tmp/ccMDAwpv.o: In function `err_sys':
codelist15-3.c:(.text+0xa9): multiple definition of `err_sys'
/tmp/ccXi2EPL.o:codelist8-7.c:(.text+0xa9): first defined here
/tmp/ccMDAwpv.o: In function `err_exit':
codelist15-3.c:(.text+0x15a): multiple definition of `err_exit'
/tmp/ccXi2EPL.o:codelist8-7.c:(.text+0x15a): first defined here
/tmp/ccMDAwpv.o: In function `err_dump':
codelist15-3.c:(.text+0x209): multiple definition of `err_dump'
/tmp/ccXi2EPL.o:codelist8-7.c:(.text+0x209): first defined here
/tmp/ccMDAwpv.o: In function `err_msg':
codelist15-3.c:(.text+0x2b5): multiple definition of `err_msg'
/tmp/ccXi2EPL.o:codelist8-7.c:(.text+0x2b5): first defined here
/tmp/ccMDAwpv.o: In function `err_quit':
codelist15-3.c:(.text+0x360): multiple definition of `err_quit'
/tmp/ccXi2EPL.o:codelist8-7.c:(.text+0x360): first defined here
collect2: ld 返回 1

找寻英特网意见如下:

  1.  我想是不是因为我在apue.h头文件中,添加了#include "error.c",虽然apue.h中
    
     #ifndef __APUE_H__
     #define __APUE_H__
    

    复制代码
    可是编写翻译器对每一种文件是个别编写翻译的,所以在文件wait.c和14.6.c中都#include “apue.h”,就能够含有两份error.c文件,
    而在error.c文件中是函数的定义(实际不是声称),所以才会身不由己那样的图景。

    所以作者删除在apue.h中#include “error.c”,makefile文件如下:

     inc=/home/lee/program/apue/apue.2e/include/
     error=/home/lee/program/apue/apue.2e/include/error.c
     a.out:14.6.c wait.c
             gcc -I $(inc) -o a.out 14.6.c wait.c $(error)
    

    复制代码
    apue.h文件中/home/lee/program/apue/apue.2d/include/目录下。
    那样就从未有过难题了。
    不知是否如小编想的如此。

    #没有错,并且还没充裕理由时尽可能不要 include c 文件

以上这条钻探讲得比较到位吧,原来,我此前按那篇小说的措施[
apue.herror.h 都拷贝到 /usr/include 文件夹下了。

实际按下面的布道,不应该把在apue.h中#include “error.c”,并把 error.c
放到 /usr/include 目录下的,在每二遍编写翻译时增添error.c就好。

 

斩草除根方案(推荐)

因此,只把 apue.h
放到/usr/include目录下,而是因为要时不常用到error.c,我们将概念三个error遭逢变量,那样就无须每一遍都把error.c拷贝到相关文书夹下参预编写翻译。

此间假定当前客商是Lee,error.c贮存在/home/Lee/code_Lee/APUE/part_of_source/:

sudo cp /home/Lee/code_Lee/APUE/part_of_source/apue.h /usr/include/apue.h

sudo chmod a+r /usr/include/apue.h

vi /home/Lee/.bashrc 在.bashrc文末添加apue_error变量:

  apue_error=/home/Lee/code_Lee/APUE/part_of_source/error.c

source ~/.bashrc      /* 这很重要,一定要执行 */

echo ${apue_error}

  /home/Lee/code_Lee/APUE/part_of_source/error.c

gcc codelist8-6.c ${apue_error} -o 8-6 成功! 
gcc codelist8-7.c codelist15-3.c ${apue_error} -o 8-7  成功!!

 

(完)

仿效资料:

  1. Linux的境况变量

   

  1. linux情况变量(转)

  

APUE中的代码不是download下来就足以一向编写翻译实践的。由于头文件的标题,要求做相关的装置,修改一下辅车相依的公文。

源代码及连锁下载见:http://www.linuxidc.com/Linux/2011-04/34662.htm

1. 编译

编排列出贰个目录中存有文件名字的例证

ckt@ubuntu:~/work/unix/code$ vi ls_test.c

#include "apue.h"
#include <dirent.h>

int main(int argc, char const *argv[])
{
DIR             *dp;
struct  dirent  *dirp;

if (argc != 2) 
    err_quit("eeee");
if ((dp = opendir(argv[1])) == NULL)
    err_sys("can't open %s", argv[1]);
while ((dirp = readdir(dp)) != NULL)
    printf("%s\n", dirp->d_name);

closedir(dp);
exit(0);
}

执行cc ls_test.c 举行编写翻译,会报错”apue.h: No such file or directory”

ckt@ubuntu:~/work/unix/code$ cc ls_test.c 
ls_test.c:1:18: fatal error: apue.h: No such file or directory
compilation terminated.

makefile编写难点:multiple definition of

在RMB.o里有八个rmb_chk_str与你的test毛外祖父.o中的定义再一次了,看一下,是哪个定义错了

makefile里瞅着怪的正是:$CC $(LIBFLAGS) $? -o
[email protected]
$(LIBS1) 那句,改成以下的查究
$CC $? -o
[email protected]
$(LIBFLAGS) $(LIBS1)
 

首先从

下一场,apue那么些文件里include了其余一些.h文件~
还应该有风度翩翩部分常量和函数的扬言(前段时间还不懂是干嘛的)

2. 下载apue源码

apue是Advanced Programming in the UNIX
Environment的缩写,apue.h是作者自个儿定义的头文件。由此,要求从APUE的网址上下载源码,导入apue.h等编写翻译正视的公文。

APUE网站:http://www.apuebook.com/
, 选取相应版本。

威尼斯人线上娱乐 3

APUE

下载实现未来,将其解压。

ckt@ubuntu:~/work/unix/code$ wget http://www.apuebook.com/src.3e.tar.gz
ckt@ubuntu:~/work/unix/code$ ls
ls_test.c  src.3e  src.3e.tar.gz

c语言中 multiple definition of ‘main’

那您是或不是在同四个工程的此外文件中也定义了main函数呢?假设是,那必然是荒唐的;

一个工程只可以有八个main函数,你能够将此外文件的main函数改一下名字
 

definition of
`err_sys,errsys
本文地址: 难点汇报:
[点击这里直接看技术方案…

mkdir /home/Rockics/src

error.c 中定义了多少个error管理的函数貌似

3. 复制apue.h到/usr/include/

缺少的apue.h位于/apue.3e/include路线下,将其复制到/usr/include/,须要root权限

ckt@ubuntu:~/work/unix/code/src.3e$ cp ./apue.3e/include/apue.h /usr/include/
cp: cannot create regular file `/usr/include/apue.h': Permission denied

cd /home/Rockics/src/

切切实实的要在Linux情况下运作APUE书中代码要做的操作:

4. 重新编写翻译

重复编写翻译,报错undefined reference to
`err_quit’,要求找到err_quit注明的头文件,将其导入。

root@ubuntu:/home/ckt/work/unix/code# cc ls_test.c 
/tmp/cc4mpAeU.o: In function `main':
ls_test.c:(.text+0x20): undefined reference to `err_quit'
ls_test.c:(.text+0x5b): undefined reference to `err_sys'
collect2: ld returned 1 exit status

wget

1.将下载好的代码解压发生四个apue.2e文件夹

5. 复制error.c到/usr/include/

出于/usr/include/已经存在error.h,由此不能够一向复制。

root@ubuntu:/home/ckt/work/unix/code# ls -l /usr/include/ | grep erro
-rw-r--r--  1 root root   2132 Aug 27  2014 error.h

tar zxvf src.tar.gz

2.然后将apue.h 和error.c 着八个文本复制到 /usr/include 上边

6. 复制error.c到/usr/include/,并修改/usr/include/apue.h。

在apue.h文件末尾的#endif /* _APUE_H */前边加多代码#include
“error.c”,然后保留文件。

root@ubuntu:/home/ckt/work/unix/code# cp ./src.3e/apue.3e/lib/error.c /usr/include/
root@ubuntu:/home/ckt/work/unix/code# cd /usr/include/
root@ubuntu:/usr/include# vi apue.h 

解压以往获得文件夹apue.2e。根据以下步骤完结安装,则能够编写翻译相关代码:

3.展开apue.h 在终极加上 include “error.c”

7. 重新编写翻译

重复编写翻译后,未有报错,生成了a.out

root@ubuntu:/home/ckt/work/unix/code# cc ls_test.c 
root@ubuntu:home/ckt/work/unix/code# ls
a.out  ls_test.c  src.3e  src.3e.tar.gz

1.进去相应目录:cd apue.2e;

本人现在是这么消除的,编译运维了书中的几段代码~

8. 运行

运行a.out,显示出当前目录下有哪些文件

root@ubuntu:/home/ckt/work/unix/code# ./a.out ./
src.3e
..
a.out
src.3e.tar.gz
.
ls_test.c

2.改变文件Make.defines.linux:将内部的WKDI昂科拉修改为/home/罗克ics/src/apue.2e,保存退出;

威尼斯人线上娱乐 4

9. 参考

http://www.01happy.com/unix-advanced-programming-apue/
http://www.cnblogs.com/zhouyinhui/archive/2010/02/01/1661078.html

3.改变文件std/linux.mk:将个中的nawk全体修改为wak,可在vi下利用命令:%s/nawk/awk/g实现;

4.修改文件include/apue.h:在文件倒数第二行(相当于#endif之前)加入:#include
“error.c”; 这一行;

5.切换来root账户,将include/apue.h还会有lib/error.c拷贝大器晚成份到/usr/include/下

安装停止:)

测试:

本人运转APUE的首先个程序实验一下条件是还是不是OK:

APUE的首先个程序是myls.c,文件位于file/ls1.c,试试看其是不是编写翻译通过哈:

[Rockics@localhost apue.2e]$ gcc -o myls -Wall file/ls1.c

很好,未有其余警报,设置成功。

 

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图