于是乎下了一个,由于是乎想写几个sample玩玩。于是乎拿<unix 高级环境编程> sample来测试。
于是乎建了一个c++ project.
网上找编译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. 方法中基本都有这么一个步骤:
完了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"
完了在codeblocks项目里引用刚编译完的库,有几个方法:
1)将编译完的库,头文件apue.h拷贝/usr/include,库文件libapue.a拷贝到/usr/lib下,这个是系统目录,gcc编译的时候会在这目录搜寻
2)在项目属性添加静态库引用
添加静态库路径:依次点击project->bulid options->Linker setting,在该标签页中点击Add按钮添加静态库路径。
如果之前你建的是c project的话,应该就可以顺利编译通过了,但是对于建立c++的project,仍然提示链接错误,找不到函数实现,
原因是libapue.a是c库,用g++编译的时候要引用c库的话,因为c++编译的时候会在函数加一些额外字符,所以当然会链接错误。
加点额外的知识关于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,二者等价。
先上一个比较简单的单继承语法。在python3中,基类的构造函数不会被自动调用,需要手动调用,同样的方法也是这样,需要手动调用。可以使用类名称+init方法,也可以使用super语法进行调用。在下面这个例子中,子类继承了基类的方法和字段。字段会在基类中初始化。
运行结果:
BaseCalss: Constructor calledBaseCalss: self name equals BaseClass
BaseCalss: Constructor called
DerivedClass: Constructor called
BaseCalss: self name equals BaseClass
子类也可以overwrite父类的方法,那么父类的方法就不会被调用,除非手动调用:
运行结果:
BaseCalss: Constructor called
BaseCalss: self name equals BaseClass
BaseCalss: Constructor called
DerivedClass: Constructor called
self.name init value is BaseClass
DerivedClass: self name equals DerivedClass
python不仅仅支持单继承,还支持多继承,字段和方法都可以被继承。在多继承super()只能代表继承的第一个父类,所以您在子类的构造函数中,不能单独使用super().__init__(), 那只是表示调用其中一个基类的构造函数。所以用super就不是那么好用了。还是要用会原来的类名+init方法来调用。
运行结果:
BaseCalss1: Constructor called
BaseCalss1: self name1 equals BaseClass1_Name1
BaseClass2: Constructor called
BaseClass2: self name2 equals BaseClass2_Name2
BaseCalss1: Constructor called
BaseClass2: Constructor called
DerivedClass: Constructor called
BaseCalss1: self name1 equals BaseClass1_Name1
BaseClass2: self name2 equals BaseClass2_Name2
BaseCalss1: getname called, name equal BaseClass2_Name
我们可以看到,当两个基类有方法重名的时候,python3会按照您继承类的从左到右的顺序查找您调用的方法DerivedClass2(BaseClass1, BaseClass2)。在这个例子中,是先找BaseClass1,然后再找BaseClass2。
如果您的代码需要多层继承的话,可以参开多重继承的 Diamond Problem 问题。
运行结果:
Call A1's foo1
除了VIA以外其他协议的状态置为已启用,然后重启服务。
2、打开TCP/IP协议的设置。
找到相关的IP对应的设置项目:“活动”置为“是”;“已启用”置为“是”;“动态端口”无需理会。
IPALL对应的设置项目:无需理会