c语言笔记

1.归档举例
A:定义一个c语言头文件:foo.h

#ifndef __FOO_H__
#define __FOO_H__


void show(int i);

#endif


B:定义一个c语言原文件:foo.c
#include <stdio.h>


void show(int i) {
printf("Hello! %d\n", i);
}


c语言中,[color=red].c文件最终要么成一个可执行文件(必须要有main函数),要么成了一个动态连接文件(.so)[/color],中间转换过程:
第一步:.c编译成.o(.o实际上就是一个二进制文件,编译时只找所依赖.h头文件。不找所依赖的.a文件)
第二步:.o归档成.a (一般都不会执行这步,除非自己写的要给别人调用,特意执行这步)
第三步:.a连接成一个可执行文件(默认是a.out,一般通过-o参数改名成没有后缀的)
[color=red] 第二步可以省略。[/color]

比如:
[color=red]编译: gcc -c foo.c (只是编译)[/color]

注:如果直接gcc foo.c那么默认是编译并且连接,会报错。因为这样的话,就是要生成动态连接文件(需要加参数-shared)或者是生成可执行文件。因为生成动态连接文件需要加参数-shared,所以确定是生成一个可执行文件。但是没有main函数,所以就报错了。

[color=red]归档:ar -r libfoo.a foo.o[/color]

注:可以把多个.o文件归档,[color=red].a文件一般以lib开头[/color]


2.调用归档文件举例

建立一个bar.c文件

#include "foo.h"

int main() {
show(123);
return 0;
}


[color=red]#include "foo.h" ""是指在当前目录下找foo.h
如果是<foo.h> <>是指在系统所指定的目录(如:/usr/include等) 再加上 C_INCLUDE_PATH环境变量指定的目录下找,默认是/usr/include/下找foo.h[/color]

因为有main函数(一般返回0表示正常),所以可以直接生成一个可执行的文件

[color=green]通过调用.a文件来编译并连接:gcc bar.c -lfoo -L.[/color](默认生成一个a.out可执行文件)

注: -lfoo 的意思是去找libfoo.a ,不是-llibfoo,不需要加lib
-L. 的意思是在[color=red]当前目录下[/color]找libfoo.a,如果不指定就会去/usr/lib下找。-L只适用于静态文件,不适用于动态文件

也可以通过-o参数改名字: gcc -o foo bar.c -lfoo -L.生成的foo就是一个可执行的文件。


3.生成动态连接库举例:
gcc -shared foo.c 默认生成的还是a.out,因为加的是-shared参数,所以生成的a.out是一个动态连接库文件,所以最好改个名字gcc -o foo.so -shared foo.c

[color=green]通过动态连接库编译连接bar.c文件
gcc -o bar bar.c foo.so[/color]
生成的bar文件是个可执行文件,可以通过[color=red]ldd bar命令查看bar文件所依赖的所有动态连接库[/color]
比如:
[mahaibo@search2 c]$ ldd bar
foo.so (0x00e25000)
libc.so.6 => /lib/tls/libc.so.6 (0x0019a000)
/lib/ld-linux.so.2 (0x0017c000)


执行./bar会报异常:./bar: error while loading shared libraries: foo.so: cannot open shared object file: No such file or directory
因为执行的时候默认会去/usr/lib下找动态连接库,而foo.so不在/usr/lib目录下。所以需要加个环境变量
export LD_LIBRARY_PATH=/home/mahaibo/c
再执行即可.

[color=red]env 查看所有环境变量
echo $LD_LIBRARY_PATH 查看某个环境变量[/color]


4.用c调用mysql:

因为用户登录时默认会去执行用户目录下的.bashrc文件,所以需要把mysql给c调用的一些库文件添加到环境变量里,所以需要在.bashrc文件里添加内容:
[color=red]export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/mysql[/color] 找动态连接库目录
[color=red]export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include/mysql[/color] 找头文件目录
[color=red]export LIBRARY_PATH=$LIBRARY_PATH:/usr/lib/mysql[/color] 找.a文件目录

也可以在系统文件里添加:/etc/profile


连接mysql的一个实例:

#include <stdio.h>
#include <mysql.h>


int main() {
MYSQL *conn;
MYSQL_RES *res;

conn = mysql_init(NULL);
mysql_real_connect(conn, "localhost", "usename", "password", "", 3306, "/tmp/mysql.sock", 0);

int d, t;
char db[20];
char sql[40];

for (d=0; d<21; ++d) {
snprintf(db, 20, "srcstore%d", d);
mysql_select_db(conn, db);

for (t=0; t<51; ++t) {
snprintf(sql, 40, "alter table srcItem%d engine = myisam", t);
int r = mysql_query(conn, sql);
if (r==0) {
printf("db: %d table: %d OK\n", d, t);
} else {
printf("db: %d table: %d ERROR\n", d, t);
}
}
}

mysql_close(conn);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值