xiaoguozi's Blog
Pay it forword - 我并不觉的自豪,我所尝试的事情都失败了······习惯原本生活的人不容易改变,就算现状很糟,他们也很难改变,在过程中,他们还是放弃了······他们一放弃,大家就都是输家······让爱传出去,很困难,也无法预料,人们需要更细心的观察别人,要随时注意才能保护别人,因为他们未必知道自己要什么·····
codeblocks很轻巧也很好用对于c/c++编写在linux下相对于eclipse.
于是乎下了一个,由于是乎想写几个sample玩玩。于是乎拿<unix 高级环境编程> sample来测试。

于是乎建了一个c++ project.
<unix 高级环境编程>里的例子有个apue.h头文件。不是系统自带的。是作者自己写的几个util函数。
网上找编译apue.h头文件一大片。但是都是考来考去,不过核心的都差不多。不过有个方法是编译完
libapue.a静态库后,还需要在apute.h头文件尾巴加"error.c"。。完了拷贝error.c实现到目录。。
看完后。我惊了呆。。好吧。。这库还能这么用。。

既然libapue.a编译完后,apue.h里的函数声明在libapue.a都已经实现,当然包括err_xxx系列的。所以
在apue.h加"error.c"是画蛇添足。。这里不推荐此方法。。

我的环境是mint14下, IDE用的是 codeblocks. 方法中基本都有这么一个步骤:
先在这个网站 http://www.apuebook.com/src.tar.gz 下载tar.gz格式的源码包,然后解压至某个目录,比如说/home/xiaoguozi/下,然后进入目录apue.2e,把文件 Make.defines.linux 中的 WKDIR=/home/xxx/apue.2e 修改为 WKDIR=/home/xiaoguozi/apue.2e ,然后再进入apue.2e目录下的std目录,打开linux.mk,将里面的nawk全部替换为awk
如果用vim编辑的话,可以用 :1,%s/nawk/awk/g 替换字符窜

完了make, 过程中,还遇到了几个问题。(mint下,其他os不太清楚)

1: /usr/include/bits/timex.h:31:7:error: expect ':' , ',' , ';' , '}' or '__attribute__'   
 apue.2e/ipp/ipp.h中 #define status u.st 与 timex.h中的 status 冲突,更改 #define Status u.st

  

2:ARG_MAX 未定义

   在include/apue.h中加入 #define ARG_MAX 4096

   在threadctl/getenv1.c 加入 #include "../include/apue.h"

   在threadctl/getenv3.c 加入 #include "../include/apue.h"

完了之后,make应该就可以成功了

完了在codeblocks项目里引用刚编译完的库,有几个方法:
1)将编译完的库,头文件apue.h拷贝/usr/include,库文件libapue.a拷贝到/usr/lib下,这个是系统目录,gcc编译的时候会在这目录搜寻
2)在项目属性添加静态库引用
添加头文件:依次点击project->bulid options->Search directories,在该标签页中点击Compiler,单击Add按钮添加头文件路径
添加静态库路径:依次点击project->bulid options->Linker setting,在该标签页中点击Add按钮添加静态库路径。

如果之前你建的是c project的话,应该就可以顺利编译通过了,但是对于建立c++的project,仍然提示链接错误,找不到函数实现,
原因是libapue.a是c库,用g++编译的时候要引用c库的话,因为c++编译的时候会在函数加一些额外字符,所以当然会链接错误。
解决也简单的在函数库前加 extern "C",或者直接把apue.h用extern "C"包含,不清楚的补下相应知识。

加点额外的知识关于gcc/g++:
gcc和g++的区别

误区一:gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

gcc和g++的区别 我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用 gcc,链接用g++,一时也不知哪个说法正确,如果再遇上个extern "C",分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。

posted on 2013-01-04 20:23 小果子 阅读(664) 评论(0)  编辑 收藏 引用 所属分类: 学习笔记LinuxC++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理