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=;
j=;
k=add(i,j);
printf("i add j=%d\n", 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=;
j=;
k=add(i,j);
printf("i add j=%d\n", 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,然后执行即可。

LINUX下C语言编程调用函数、链接头文件以及库文件的更多相关文章

  1. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  2. Linux下C语言编程基础学习记录

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

  3. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  4. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  5. 【转】Linux基础与Linux下C语言编程基础

    原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...

  6. Linux下C语言编程中库的使用

    零.问题 1. 为什么要用到库? 2. 我要用一个库,但是,尼玛命令行上该怎么写呢?或者说库文件如何使用? 3. Linux的库在那些地方? 4. 什么是静态库,什么是动态库,二者有啥区别? 5. 常 ...

  7. linux 下C语言编程库文件处理与Makefile编写

    做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...

  8. linux下C语言编程,include的默认搜索路径

    C语言编程时,发现细节的魅力很大.较为详细了看了一下关于include的知识,发现了几点新知: 1.include<头文件名>和include"头文件名" 如:incl ...

  9. linux中c语言编程main函数和参数

    linux下main函数的的标准调用函数的标准形式 int main(int char,char *argv[]) 在main函数的两个参数中,argc必须是整型变量,其是命令行的参数的数目,argv ...

随机推荐

  1. 最小生成树详解 prim+ kruskal代码模板

    最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里 ...

  2. TP3.2写上下篇

    笔记笔记笔记记笔记!! ************************************************************************** 要实现上一篇跟下一篇,需要 ...

  3. nodejs模块学习: express-session 解析

    nodejs模块学习: express-session 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创 ...

  4. 神经网络中的BP神经网络和贝叶斯

    1 贝叶斯网络在地学中的应用 1 1.1基本原理及发展过程 1 1.2 具体的研究与应用 4 2 BP神经网络在地学中的应用 6 2.1BP神经网络简介 6 2.2基本原理 7 2.3 在地学中的具体 ...

  5. java运算符优先级与流程控制

    1. Java 的方法Method (函数 Function), 功能, 动作 1) 方法就是函数: y=f(x)=3x+6; 2) 方法的语法   (修饰词)(返回值类型)(方法名)(参数列表){  ...

  6. Spring 并发访问的线程安全性问题

    首先对于spring的IOC来说,对象是由Spring来帮我们管理,也就是在Spring启动的时候,在Spring容器中,由Spring给我们创建的,Spring会帮我们维护,一般都是单例的,也就是一 ...

  7. jsp隐藏关键 敏感信息,只显示前后字段

    今天写jsp页面,要求对字段中间部分隐藏,只显示前几位和后几位.搜了一下发现网上大都是隐藏前面指定字段,或者是利用正则表达式隐藏手机号或是身份证.这样的话必须预先知道字段长度,而我不想知道长度只显示前 ...

  8. 树状数组lowbit()函数原理的解释 x&(x^(x-1)) x&-x

    树状数组lowbit()函数所求的就是最低位1的位置所以可以通过位运算来计算 树状数组通过 x&(x^(x-1)) 能够成功求出lowbit的原因: 首先设x=6,即110(2) 于是我们使 ...

  9. Git版本控制之多人协作

         上篇文章我们主要简单的介绍了有关git的一些基本常识和一些简单的命令.但那终究是皮毛,我们使用git最主要的目的还是管理我们的项目,多人协作.本篇文章主要涉及以下两个大模块: 分支的概念及原 ...

  10. JavaScript基础知识(二)

    一.JavaScript事件详解 1.事件流:描述的是在页面中结束事件的顺序 事件传递有两种方式:冒泡与捕获. 事件传递定义了元素事件触发的顺序. 如果你将 <p> 元素插入到 <d ...