• LINUX下C语言编程调用函数、链接头文件以及库文件


    LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法:

    1.当需要调用函数的个数比较少时,可以直接在main函数中包含该文件,比如一个文件夹下包含add.c和main.c文件:

    方法一:

         文件add.c定义两个整数相加的函数,code如下:

    #include <stdio.h>
    #include <math.h>
    int
    add(int a,int b)
    {
       int z;
       z=a+b;
       return z;
    }

        主函数main.c的code如下:

    #include <stdio.h>
    #include <math.h>
    #include"add.c"
    int
    main()
    {
        int i, j, k;
        i=1;
        j=2;
        k=add(i,j);
        printf("i add j=%d
    ", k);
    }

    编译生成可执行文件:gcc -o main main.c

    执行:  ./main

    方法二:

    可以通过写个头文件声明下函数add,然后在main函数中包含该文件,再写个makefile文件,将其链接好即可,实现如下:

    新建fun.h, code如下:

    #ifndef _FUN_H_
    #define _FUN_H_
    #endif
    #include<stdio.h>
    #include<math.h>
    
    int 
    add(int a,int b);

    此时main函数应当包含这个头文件,main函数改为如下:

    #include <stdio.h>
    #include <math.h>
    #include"fun.h"
    int
    main()
    {
        int i, j, k;
        i=1;
        j=2;
        k=add(i,j);
        printf("i add j=%d
    ", k);
    }

     写个简单的makefile,编译

    main:main.o add.o 
        gcc main.o add.o -o main
    main.o:main.c fun.h add.c
        gcc -c main.c -o main.o
    add.o:add.c fun.h
        gcc -c add.c -o add.o

    make ,即可得到可执行文件main

    ./main ,就得到结果。

    2.当定义的函数比较多时,这时可以将其打包放在一个库文件里面,然后在编译main函数时链接该库文件即可,库文件分为动态库和静态库,其链接方法如下:

    比如:
    目录1:/home/文档/libraries_test/head //里面有 add.c multi.c  (multi.c定义为两个整数相乘,这里没有列出)
    目录2:/home/文档/libraries_test/test_head //里面有函数,需要包含目录一里的头文件 main.c

    静态库链接:

    cd 目录1

    写个makefile文件,生成静态库。makefile内容如下:

    add.o:add.c 
           gcc -c add.c -o add.o
       multi.o:multi.c 
           gcc -c multi.c -o multi.o
       libhead.a:add.o multi.o
           ar crv libhead.a add.o multi.o

    然后:make
    生成了libhead.a文件

    cd 目录2

    写个makefile文件,生成可执行文件

    main:main.c
          gcc main.c -I${目录1}$ -o main -L${目录1}$ -lhead

    注意:-I..这个路径指的是头文件的路径(由于这里没有头文件,可以去掉-I{目录1})
    -L...这个指的是库的路径,-l..这里指的是库名,如果需要引用-L..下的两个库(如libblas.a libcblas.a)
    这个时候就这样写: -L... -lcblas -lblas (注意:虽然用的是libcblas.a和libblas.a 但是在写路径时,只需写cblas和blas,即省略lib .a)

    注意啦!!!!如将该.a文件放在/usr/lib或者/usr/local/lib下(gcc默认的库搜索路径下,由于/usr/lib下库文件比较多,我一般把常用的库放在/usr/local/lib下),此时就不需要指定路径了,这个时候编译:
    gcc test1.c -o test -lcblas -lblas (注意编译的时候一定要用 -l.. 指定是哪个库)

    动态库链接:

    cd 目录1  

    写个makefile文件,生成动态库。makefile内容如下:

    add.o:add.c head.h
      gcc
    -c add.c -o add.o
    multi.o:multi.c head.c gcc
    -c multi.c -o multi.o
    libhead.so:add.o multi.o gcc
    -o libhead.so -fPIC add.o multi.o

    然后:make
    生成了libhead.so文件

    cd 目录2
    写个makefile文件,生成可执行文件
    makefile文件生成如下:

    main:main.c
        gcc main.c -I${目录1}$ -o main -Wl,-rpath,${目录1}$ -lhead

    make即可生成可执行文件main,然后执行即可。 

  • 相关阅读:
    supervisor管理nginx+tomcat容器
    【转】Linux下java进程CPU占用率高分析方法
    【转】ElasticSearch7.3 学习之生产环境实时重建索引
    【转】Python APScheduler
    Shell编程之if简单判断两个数字大小
    某年某月某日某时,某人在工作中设置crontab定时任务规则保存时,提示“No space left on device”,此时用df h检查磁盘,发现还有剩余空间.请问是什么原因及如何排查?什么会导致这种事情发生?
    【转】说说{}与[]这两个符号有什么区别?
    torchtext
    torch.manual_seed()
    判断数据是否在gpu
  • 原文地址:https://www.cnblogs.com/kuangsyx/p/7269448.html
Copyright © 2020-2023  润新知