Beginning Linux Programming(Get Start)

1 篇文章 0 订阅

1、Hello World

/*** hello.c  **/
#include <stdio.h>
#include <stdlib.h>
int main()
{
    printf(“Hello World!\n”);
    exit(0);
}

 保存代码到hello.c,使用gcc编译:

$ gcc -o hello hello.c

在当前目录产生一个可执行的hello文件,输入$ ./hello 执行输出  Hello World!

 

2、引入头文件

#include <stdio.h> 表示引入头文件,另外还可以使用命令行参数引入外部(目录/usr/openwin/include中)的头文件,(-I是大写的i,include的首字母)

$ gcc -I/usr/openwin/include fred.c

#include <stdio.h>表示从系统路径中(PATH变量指定目录)查找头文件,一般是引入标准库中的头文件;

#include "fred.h" 表示优先从当前目录开始查找头文件,一般是用户自定义的头文件或者第三方库的引入;

 

3、Library文件

一般静态库文件以.a为后缀,.so为共享库文件(类似windows中的lib文件和dll文件)

通常使用 -l 参数(小写的L)引入库,如要引入math相关的库,有两种方式:

① $ gcc -o fred fred.c /usr/lib/libm.a (直接在命令最后跟上库文件)

② $ gcc -o fred fred.c -lm (-lm是libm.a的速记法,注意lm之间没有空格)

如需要引入libX11

$ gcc -o x11fred -L/usr/openwin/lib x11fred.c -lX11

此处可以注意到使用了-L参数,因为libX11的库文件不在标准库的位置(/lib,/usr/lib),需要使用-L参数指明位置;

 

3.1、静态库文件

3.1.1、编译生成OBJ文件

如下两个c源文件,我们创建相应的库

 

/*** fred.c  ****/
#include <stdio.h>
void fred(int arg)
{
    printf(“fred: we passed %d\n”, arg);
}

 

/*** bill.c ***/
#include <stdio.h>
void bill(char *arg)
{
    printf(“bill: we passed %s\n”, arg);
}

使用-c参数编译生成相应的obj文件(编译产生的中间文件,非最终的可执行文件):
    $ gcc -c bill.c fred.c

在当前目录下,使用ls命令查看刚生成的obj文件:
    $ ls *.o
    结果: bill.o fred.o

要在程序中引入该编译过的对象,

① 首先创建对应的.h头文件,声明库中的函数

 

/* lib.h */

void bill(char *);

void fred(int);

 

② 在程序中引入lib.h头文件

/* program.c */

#include <stdlib.h>
#include “lib.h”

int main()
{
    bill(“Hello World”);
    exit(0);
}

 编译执行上述代码:

   

$ gcc -c program.c
$ gcc -o program program.o bill.o
$ ./program
   bill: we passed Hello World
$

 

3.1.2 生成库文件(ar命令)

$ ar crv libfoo.a bill.o fred.o
   a - bill.o
   a - fred.o

使用ar命令将bill.o和fred.o加到库文件libfoo.a中

需要注意的是,在一些系统中,尤其是衍生自Berkeley UNIX的系统,需要使用ranlib命令创建库文件对应的内容表:

$ ranlib libfoo.a

在linux中,此步骤不是必须的,但是一般不会出错。

 

下面,我们就可以直接使用libfoo.a库了:

$ gcc -o program program.o libfoo.a
$ ./program
   bill: we passed Hello World
$

同样的,我们可以使用 -l 参数链接该库文件,但是由于不是标准库文件,需要使用-L 指定目录:

$ gcc –o program program.o –L. –lfoo

 

通过下表,我们可以更清晰的理解各种文件之间的关系

ItemUNIXWindows
object modulefunc.ofunc.obj
static librarylib.a

lib.lib

shared librarylib.so

lib.dll

programprogramprogram.exe

 

 3.2 共享库文件

生成so

 $gcc bill.c fred.c -fPIC -shared -o libfoo.so

使用so编译(-lfoo即引入libfoo.so文件)

$ gcc -g program.c -o program -L. -lfoo

查看program执行时需要链接的库

   

$ ldd program
        linux-vdso.so.1 =>  (0x00007fff785fe000)
        libfoo.so => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007f23e21d2000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f23e2574000)

执行program

命令行输入$./program 回车后报错:
./program: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory

原因是libfoo.so不是标准的库,不在PATH环境下,需要额外指明lib路径,如下:

$ export LD_LIBRARY_PATH=./
$ ./program
    bill: we passed Hello World!

 

 

 

详细的操作步骤如下:

$ mkdir lib
$ cd lib

$
$ vi fred.c
$ vi bill.c
$ ls
bill.c  fred.c
$ gcc -c bill.c fred.c
$ ls
bill.c  bill.o  fred.c  fred.o

$
$ vi lib.h
$ vi program.c
$ ls
bill.c  bill.o  fred.c  fred.o  lib.h  program.c
$ gcc -c program.c
$ ls
bill.c  bill.o  fred.c  fred.o  lib.h  program.c  program.o
$ gcc -o program program.o bill.o
$ ls
bill.c  bill.o  fred.c  fred.o  lib.h  program  program.c  program.o
$ ./program
bill: we passed Hello World!

$
$ ar crv libfoo.a bill.o fred.o
a - bill.o
a - fred.o
$ ranlib libfoo.a
$ ls
bill.c  bill.o  fred.c  fred.o  libfoo.a  lib.h  program  program.c  program.o

$
$ rm program
$ ls
bill.c  bill.o  fred.c  fred.o  libfoo.a  lib.h  program.c  program.o
$ gcc -o program program.o libfoo.a
$ ls
bill.c  bill.o  fred.c  fred.o  libfoo.a  lib.h  program  program.c  program.o
$ ./program
bill: we passed Hello World!

$
$ rm program
$ ls
bill.c  fred.c  libfoo.a   lib.h      program.o
bill.o  fred.o  libfoo.so  program.c
$ gcc -g program.c -o program -L. -lfoo
$ ls
bill.c  fred.c  libfoo.a   lib.h    program.c
bill.o  fred.o  libfoo.so  program  program.o
$ ldd program
    linux-vdso.so.1 =>  (0x00007fff785fe000)
    libfoo.so => not found
    libc.so.6 => /lib64/libc.so.6 (0x00007f23e21d2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f23e2574000)
$ program
-bash: program: command not found
$ ./program
./program: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
$ export LD_LIBRARY_PATH=./
$ ./program
bill: we passed Hello World!
$

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值