c和c++链接未定义的问题

c/c++错误之 Undefined reference 未定义的问题

首先看一看链接器的作用。在构建c++程序的时候,几乎所有的程序都由多个c++源文件组成。使用c++编译器分别编译这些文件,以生成包含机器代码的目标文件(.o 或者 .obj 文件),每个目标文件对其他文件一无所知。所以,如果从另一个目标文件中存在的一个目标文件调用函数,则编译器将无法提供被调用函数的地址。

一旦生成了所有的目标文件,想要生成最终的可执行文件,那么链接器就会查看他们并计算出可执行文件中函数的最终地址是什么。然后他修补了编译器无法提供的地址。对于可能使用的任何库(.a 和 .lib 文件) ,他都执行相同的操作。最后,他将可执行文件写到磁盘。

链接器通常是与编译器分开的程序,例如:gcc 链接器成为 ld。传统上,链接器技术落后于编译器,主要是因为构建编译器比构建链接器通常更加有趣。并且链接程序不一定有权访问他们正在链接的目标文件的源代码。

好了,清楚了这个,未定义的错误就很明显了。“undefined reference” 错误意味着程序中的名称(函数、变量、常量等)具有引用,链接器在查找时找不到其定义。

比如:1: 调用的函数真的没有定义。 2: 定义的函数或其他与声明的不一样

查看更多

c++初始化的问题记录

C ++标准说:

可以转移到块中,但不能以初始化绕过声明的方式转移。从具有自动存储持续时间的局部变量不在范围内的点跳转到其处于范围内的点的程序是错误的,除非该变量具有POD类型(3.9)且声明时没有初始化程序。

switch(k) { case1: int t = 4; break; default: break; }

这个代码会出现交叉初始化错误,因为可以跳过变量 t 的初始化,但是此后它仍然是在作用域内,即使它从来没有首先创建过也是如此。

switch(k) { case1: { int t = 4; } break; default: break; }

查看更多

show slave status\G参数介绍

show slave status\G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Slave_IO_State: Waiting for master to send event  等待 master 发生事件

Master_Host: 10.173.1.203 当前的主服务器主机

Master_User: backup 被用于连接主服务器的当前用户

Master_Port: 3306 当前的主服务器接口

Connect_Retry: 60 选项的当前值

Master_Log_File: mysql-bin.000010 SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的名称

Read_Master_Log_Pos: 188793146 在当前的主服务器二进制日志中,SLAVE中的I/O线程已经读取的位置

Relay_Log_File: mysql-relay-bin.000002 SQL线程当前正在读取和执行的中继日志文件的名称

Relay_Log_Pos: 186655308 在当前的中继日志中,SQL线程已读取和执行的位置

Relay_Master_Log_File: mysql-bin.000010 由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称

Slave_IO_Running: Yes I/O线程是否被启动并成功地连接到主服务器上

Slave_SQL_Running: Yes SQL线程是否被启动

Replicate_Do_DB: replicate-do-db选项的当前值

Replicate_Ignore_DB: mysql replicate-ignore-db选项的当前值

Replicate_Do_Table: replicate-do-table选项的当前值

Replicate_Ignore_Table: replicate-ignore-table选项的当前值

Replicate_Wild_Do_Table: replicate-wild-do-table选项的当前值

Replicate_Wild_Ignore_Table: replicate-wild-ignore_table选项的当前值

Last_Errno: 0 最近一次错误码

Last_Error: 最近一次错误内容

Skip_Counter: 0 最近被使用的用于SQL_SLAVE_SKIP_COUNTER的值

Exec_Master_Log_Pos: 188793146 来自主服务器的二进制日志的由SQL线程执行的上一个时间的位置(Relay_Master_Log_File)。在主服务器的二进制日志中的(Relay_Master_Log_File,Exec_Master_Log_Pos)对应于在中继日志中(Relay_Log_File,Relay_Log_Pos)

Relay_Log_Space: 186655464 所有原有的中继日志结合起来的总大小

Until_Condition: None 如果没有指定UNTIL子句,则没有值。如果从属服务器正在读取,直到达到主服务器的二进制日志的给定位置为止,则值为Master。如果从属服务器正在读取,直到达到其中继日志的给定位置为止,则值为Relay

Until_Log_File: 用于指示日志文件名,日志文件名和位置值定义了SQL线程在哪个点中止执行

Until_Log_Pos: 0 用于指示日志位置值,日志文件名和位置值定义了SQL线程在哪个点中止执行

Master_SSL_Allowed: No 如果允许对主服务器进行SSL连接,则值为Yes。如果不允许对主服务器进行SSL连接,则值为No。如果允许SSL连接,但是从属服务器没有让SSL支持被启用,则值为Ignored。

Master_SSL_CA_File: master-ca选项的当前值

Master_SSL_CA_Path: master-capath选项的当前值

Master_SSL_Cert: master-cert选项的当前值

Master_SSL_Cipher: master-cipher选项的当前值

Master_SSL_Key: master-key选项的当前值

Seconds_Behind_Master: 0 本字段是从属服务器“落后”多少的一个指示。当从属SQL线程正在运行时(处理更新),本字段为在主服务器上由此线程执行的最近的一个事件的时间标记开始,已经过的秒数。当此线程被从属服务器I/O线程赶上,并进入闲置状态,等待来自I/O线程的更多的事件时,本字段为零。总之,本字段测量从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计。如果主服务器和从属服务器之间的网络连接较快,则从属服务器I/O线程会非常接近主服务器,所以本字段能够十分近似地指示,从属服务器SQL线程比主服务器落后多少。如果网络较慢,则这种指示不准确;从属SQL线程经常会赶上读取速度较慢地从属服务器I/O线程,因此,Seconds_Behind_Master经常显示值为0。即使I/O线程落后于主服务器时,也是如此。换句话说,本列只对速度快的网络有用。即使主服务器和从属服务器不具有相同的时钟,时间差计算也会起作用(当从属服务器I/O线程启动时,计算时间差。并假定从此时以后,时间差保持不变)。如果从属SQL线程不运行,或者如果从属服务器I/O线程不运行或未与主服务器连接,则Seconds_Behind_Master为NULL(意义为“未知”)。举例说明,如果在重新连接之前,从属服务器I/O线程休眠了master-connect-retry秒,则显示NULL,因为从属服务器不知道主服务器正在做什么,也不能有把握地说落后多少。本字段有一个限制。时间标记通过复制被保留,这意味着,如果一个主服务器M1本身是一个从属服务器M0,则来自M1的binlog的任何事件(通过复制来自M0的binlog的事件而产生),与原事件具有相同的时间标记。这可以使MySQL成功地复制TIMESTAMP。但是,Seconds_Behind_Master的缺点是,如果M1也收到来自客户端的直接更新,则值会随机变化,因为有时最近的M1时间来自M0,有时来自直接更新,最近的时间标记也是如此。

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1 主服务器的server-ID值

通过free命令理解linux内存管理

简介

linux 下面查看内存状态可以使用 free 命令,但是如果不了解 linux 内存管理机制的话,对输出也会摸不着头脑,这篇文章就说明一下各个数据的意思。

下面是我电脑上虚拟机,直接使用 free 命令的数据结果。

vagrant@precise64:~$ free total used free shared buffers cached Mem: 374256 330952 43304 0 14400 238128 -/+ buffers/cache: 78424 295832 Swap: 786428 2224 784204

所有的数据默认都是 KB,第一行有六个值:

查看更多

mysql索引

mysql索引

当使用主键或者唯一键创建表时,MySQL 会自动创建一个名为 PRIMARY 的特殊索引。索引成为聚簇索引。PRIMARY索引是特殊的,因为索引本身与数据一起存储在同一个表中。聚簇索引强制执行表中的行顺序。除PRIMARY索引之外的其他索引称为二级索引或非聚簇索引。

一、操作索引的语法

  • 创建普通索引
1
2
3
4
5
6
7
8
1. create index indexName on table_name (column_list)
如果是char、varchar,length可以小于字段实际长度;如果是 blob、text类型,必须指定 length
2. alter table tableName add index indexName(columnName_list)
3. create table mytable(
id int not null,
username varchar(16) not null,
index [idnexName] (columnName_list(length))
);

查看更多

mysql修改默认的超时时间

mysql修改默认的超时时间

Mysql数据库一般默认的连接超时时间是28800s(8小时)

1
2
3
show global variables like 'wait_timeout';
结果:
| wait_timeout | 28800 |
  • 方法1: 临时方法,重启MYSQL服务器会失效,恢复到默认值
    MySQL服务器关闭交互式连接前等待的秒数。通过MySQL 客户端连接数据库的是交互会话,
    set global interactive_timeout = 259200;
    MySQL服务器关闭非交互连接之前等待的秒数。通过jdbc等程序连接数据库的是非交互会话。
    set global wait_timeout = 259200;

查看更多

linux上iptables的原理及使用

iptables 命令原理使用详解

iptables的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者经该设备转发、路由时,都可以使用iptables进行控制。

iptables名词和术语

  • 容器:用来形容包含或者属于的关系
  • iptables是表的容器,iptables包含多个表
  • 表(tables)又是链(chains)的容器
查看更多

linux权限和umask值

umask值

umask值用于设置用户在创建文件时的默认权限,当我们在系统中创建目录或文件时,目录或文件所具有的默认权限就是由umask值决定的。

对于root用户,系统默认的umask值是0022;对于普通用户,系统默认的umask值是0002。执行umask命令可以查看当前用户的umask值。

umask值一共有4组数字,其中第1组数字用于定义特殊权限,我们一般不予考虑,与一般权限有关的是后3组数字。

默认情况下,对于目录,用户所能拥有的最大权限是777;对于文件,用户所能拥有的最大权限是目录的最大权限去掉执行权限,即666。
因为x执行权限对于目录是必须的,没有执行权限就无法进入目录,而对于文件则不必默认赋予x执行权限。

对于root用户,他的umask值是022。
当root用户创建目录时,默认的权限就是用最大权限777去掉相应位置的umask值权限,即对于所有者不必去掉任何权限,
对于所属组要去掉w权限,对于其他用户也要去掉w权限,所以目录的默认权限就是755;
当root用户创建文件时,默认的权限则是用最大权限666去掉相应位置的umask值,即文件的默认权限是644。

查看更多

数据库宽表与窄表

一、宽表

(1)宽表:从字面意义上讲就是字段比较多的数据库表。通常是指业务主题相关的指标、维度、属性关联在一起的一张数据库表。由于把不同的内容都放在同一张表存储,宽表已经不符合三范式的模型设计规范,随之带来的主要坏处就是数据的大量冗余,与之相对应的好处就是查询性能的提高与便捷。这种宽表的设计广泛应用于数据挖掘模型训练前的数据准备,通过把相关字段放在同一张表中,可以大大提高数据挖掘模型训练过程中迭代计算时的效率问题。(一句话,空间换时间,便于训练迭代、减少表关联数量,修改少量数据时不需要该多张表)

(2)“宽表”特点:一个表就是一个class,每个字段就是一个filed,操作简单。但不便扩展。

二、窄表

(1)窄表:严格按照数据库设计三范式。尽量减少数据冗余,但是缺点是修改一个数据可能需要修改多张表。

(2)“窄表”特点:方便扩展,能适应各种复杂的数据结构(树形、继承等),无论有多少配置,都不用修改表结构。但代码逻辑可能需要包装一下。