`
ttitfly
  • 浏览: 616730 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

比如:
编译: gcc -c foo.c (只是编译)

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

归档:ar -r libfoo.a foo.o

注:可以把多个.o文件归档,.a文件一般以lib开头



2.调用归档文件举例

建立一个bar.c文件
#include "foo.h"

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


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


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

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

注: -lfoo 的意思是去找libfoo.a ,不是-llibfoo,不需要加lib
    -L. 的意思是在当前目录下找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

通过动态连接库编译连接bar.c文件
gcc -o bar bar.c foo.so

生成的bar文件是个可执行文件,可以通过ldd bar命令查看bar文件所依赖的所有动态连接库
比如:
[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
再执行即可.

env 查看所有环境变量
echo $LD_LIBRARY_PATH 查看某个环境变量



4.用c调用mysql:

因为用户登录时默认会去执行用户目录下的.bashrc文件,所以需要把mysql给c调用的一些库文件添加到环境变量里,所以需要在.bashrc文件里添加内容:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/mysql  找动态连接库目录
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include/mysql  找头文件目录
export LIBRARY_PATH=$LIBRARY_PATH:/usr/lib/mysql 找.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;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics