`

C语言入门实践

 
阅读更多

闲言

 

用Java语言用久了已经习惯了“Java思维”,不禁想起网上流行的一句话“如果你手里有一把锤子,所有东西看上去都像钉子”......

 

最近用Java Swing写了个工具,打包成exe做些简单的密码运算,东西做完了测试效果还可以;在公司实际用的时候发现点退出的时候会提示程序崩溃。开始以为代码有缺陷,windows程序dump也看不懂,查了半天也没结果,很无语。

 

前两天用IDEA,关闭的时候居然也崩溃了,经过总结对比,终于发现罪魁祸首是google拼音输入法(近期安装的最新版本),windows原生的exe却没事儿。于是有了重拾C的想法。

 

以前也在别人的代码基础上修修补补鼓捣点东西,但是C的运行原理和Java差别太大,以至于去问做C的人怎么把COM像静态库一样打包到exe里面,闹出了笑话。

 

买了本《程序员的自我修养》,在网上补了下,开始C语言的入门之旅。

 

看这篇博文的人想必都在学校里入门过C了,所以这里没有数组指针结构体,直接面向平台编程。

 

正言

 

一段代码要变成Linux(Windows也一样)下ELF格式的可运行文件,要经过以下步骤:

1、预处理

gcc -E test.c -o test.i 或 gcc -E test.c

2、编译

gcc -S test.i -o test.s 

3、汇编

gcc -c test.s -o test.o

4、链接

gcc test.o -o test

 每一步生成的结果都有对应工具可以查看,暂且不论,因为我们的首要目标是实用,所以离不开头文件和库,包括动态库和静态库。

 

 这里是一个“五脏俱全”包含五个文件的HelloWorld,五个文件分别是。

    join.c

#include <string.h>
/*
 *join two string together
 */
char *join(char *dst, char *src){
        char* fullName = (char*)malloc(strlen(dst) + strlen(src));
        strcpy(fullName, dst);
        strcat(fullName, src);
        return fullName;
}

    hello.c 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* join(char* dst, char* src);

void hello(char* name, char* familyName){
        char* who = join(name, familyName);
        printf("Hi i am: %s.\n", name);
        free(who);
}

    hello.h 

#include <stdio.h>
#include <stdlib.h>
void hello(char* name, char* family_name);

    main.c

#include "hello.h"
int main(){
        char full_name[50] = "Jack boy";
        hello(full_name, "Gates");
}

 这里把join.c编译为一个静态库(动态库后面会有)main.c通过hello.h引用hello.c。

 

编译步骤如下:

第一步把join.c编译成目标文件:

gcc -c join.c -o join.o

 第二步把目标文件打包成静态库

ar -rsv libjoin.a join.o//如果有多个.o文件,空格分开
 第三步完成链接
gcc -ggdb hello.c main.c -L. -ljoin -o main//为了方便GDB调试,这里加上-ggdb
 这里-L指定静态库位置,-l指定库名;
注意:按照约定,库名不包括lib前缀和后缀名,这里库文件为libjoin.a,引用时为-ljoin。
运行结果如下:
 
  • 大小: 2.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics