精华内容
下载资源
问答
  • 最近做项目的时候,需要跟人工智能组对接应用接口,要把写好的C函数给Python...静态函数的话,事实上就是在程序在链接时整个会一起编译进目标文件中,而动态函数则不会,只是编译进去一个链接(符号),这种有点

    最近做项目的时候,需要跟人工智能组对接应用接口,要把写好的C函数给Python代码调用,所以打算把写好的代码制作成动态库,给他们直接import,随手记录一点相关知识

    1.概念

    程序的函数库一般就是:静态函数库、共享函数库以及动态加载函数库

    函数库一般来说编译集成了一系列我们要使用的接口(函数),程序源代码编译完成之后有一个链接环节,会通过链接器与使用到的函数库进行链接。

    静态函数库的话,事实上就是在程序在链接时整个库会一起编译进目标文件中,而动态函数库则不会,只是编译进去一个链接(符号),这种有点类似硬链接和软链接的区别。这种区别导致编译出来的目标文件的大小有明显差别。

    静态函数库在linux下的后缀一般为 .a,动态函数库的后缀一般为.so。

    linux下动态函数库(共享库)的命名规则:

    2.例程

    我们编写一下例程做一下简单记录

    我们需要编写一下mytest.c,mytest.h,Makefile(习惯了嵌入式开发,所以还是习惯性编写一下Makefile,简化一下编译流程)

    //mytest.h
    
    #ifndef MY_TEST_H
    #define MY_TEST_H
    
    void Mytest();
    #endif
    //mytest.c
    
    #include <stdio.h>
    #include "mytest.h"
    
    void Mytest()
    {
        printf("This is a sample.\n");
    }
    # Makefile
     
    
    libtestc.so:libtest.o
    	gcc -shared libtestc.o -lc -o libtestc.so
    libtest.o:mytest.c
    	gcc -fPIC -c mytest.c -o libtestc.o
    all:libtestc.so
    clean:
    	rm -f *.o *.so

    展开全文
  • Linux下将几个.c文件(test1.c和test2.c)编译动态连接 libtest.so 的命令为: $ gcc test1.c test2.c -fPIC -shared -o libtest.so 选项说明: -shared: 该选项指定生成动态连接。 -fPIC : 表示编译为...

    Linux下将几个.c文件(test1.c和test2.c)编译成动态连接库 libtest.so 的命令为:

    $ gcc test1.c test2.c -fPIC -shared -o libtest.so


    选项说明:

    -shared: 该选项指定生成动态连接库。

    -fPIC : 表示编译为独立位置的代码,不用此选项的话编译后的代码是位置相关的,不能真正达到代码共享。

    展开全文
  • C语言使用动态链接库静态链接库

    千次阅读 2017-12-01 19:31:59
    1.C语言中的链接器   (1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件。  (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的...

    1.C语言中的链接器

     

    1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件。 

    2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。 

    2.静态链接

    由链接器在链接时将库的内容直接加入到可执行程序中

     

    编译静态库源码:gcc –c lib.c –o lib.o

    生成静态库文件:ar –q lib.a lib.o //lib.o 与其他文件打包到 lib.a

    使用静态库编译:gcc main.c lib.a –o main.out

    3.动态链接

    可执行程序在运行时才动态加载库进行链接 ,库的内容不会进入可执行程序当中

     

    编译动态库源码:gcc –shared dlib.c –o dlib.so

    使用动态库编译:gcc main.c -ldl –o main.out

     

    4.dlopen、dlsym、dlclose使用动态库

    为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件。linux提供了加载和处理动态链接库的系统调用,非常方便。 

    打开动态库:dlopen

    查找动态库中的函数并返回调用地址:dlsym 

    关闭动态库:dlclose

    dlib.c 库 

    复制代码
    char* name()
    {
        return "Dynamic Lib";
    }
    int add(int a, int b)
    {
        return a + b;
    }
    复制代码

    test.c

    复制代码
    #include <stdio.h>
    
    
    
    
    
    #include <dlfcn.h> int main() { // 打开(加载)动态库 void* pdlib = dlopen( " ./dlib.so " , RTLD_LAZY); char* (* pname)(); int (*padd)( int, int ); if( pdlib != NULL ) { // 查找函数地址 pname = dlsym(pdlib, " name " ); padd = dlsym(pdlib, " add " ); if( (pname != NULL) && (padd != NULL) ) { printf( " Name: %s\n " , pname()); printf( " Result: %d\n ", padd( 2, 3 )); } // 关闭动态库 dlclose(pdlib); } else { printf( " Cannot open lib ...\n " ); } return 0 ; }
    复制代码

    gcc -shared dlib.c -o dlib.so

    gcc test.c -o test.o -ldl

     

     

    参考资料:
    www.dt4sw.com
    http://www.cnblogs.com/5iedu/category/804081.html

     

    展开全文
  • 如何使用C语言编译动态库与静态 关于C语言动态与静态的作用这里就不在详细赘述了,重点说一下如何编译动态与静态及使用,一些大型的程序一般拥有着良好的架构,各个功能模块之间能够相互协调工作,达到...

    如何使用C语言编译动态库与静态库

    关于C语言动态库与静态库的作用这里就不在详细赘述了,重点说一下如何编译动态库与静态库及使用,一些大型的程序一般拥有着良好的架构,各个功能模块之间能够相互协调工作,达到预期的效果,但有的程序并不是所有的源码都是自己编写,特别像是用到芯片厂商的提供的库;能够把这些融合起来的就是需要提供的库;希望对大家学习C语言有所帮助。
    原料:test1.c test2.c main.c
    (详细的代码不再详细列出来,大家都是开发者,都希望用最短的时间找到想找的东西,而不是浪费太多的时间在细枝末节上)
    1.如何编译动态库
    gcc test1.c test2.c -shared -fPIC -o libtest.so
    使用动态库
    gcc main.c -L. -ltest -o a.out
    (
    -L : 表示需要库的路径
    -l:表示需要库的名称,如libtest.so,名称则为test
    )
    (ps:执行a.out时有可能提示找不到libtest.so文件,这时需要把库文件放入到/lib等目录下,或者添加环境变量LD_LIBRARY_PATH,包含有库文件的路径即可)
    2.如何编译静态库
    gcc -c test1.c test2.c
    ar -r libtest.a test1.o test2.o
    使用静态库
    gcc main.c -static -L. -ltest -o a.out
    (
    -static:可强制编译时使用静态库,如果不使用这个参数,而静态库与动态库同名的话,会优先使用动态库
    )
    3.静态库与动态库
    在可执行程序执行条件上,使用静态库编译时,生成的执行文件就不再依赖.a静态库文件,而使用动态库编译的执行文件必须包含.so库文件才能运行;
    在可执行程序的执行速度上,静态编译的文件会优于动态编译(毕竟静态编译把库文件的代码都编译到执行文件,与动态编译不同在执行动态库中函数时才会去路径下的动态库中寻找链接);
    在可执行程序的大小上,静态编译后的文件大小比动态编译的文件大很多;如果对内存要求较高的可选择用动态编译,虽然会慢一点;
    在修改库之后,静态编译的文件需要再把静态库和原main.c文件都重新编译才能使用,而动态编译的文件不需要再编译main.c,只需要把新编译的动态库覆盖原来的动态库,再重新运行可执行文件即可生效;相比于编译一个大型工程需要一两小时,动态库的优势就不必多言了;
    本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

    展开全文
  • C语言 之建立动态链接库

    千次阅读 2020-03-23 20:14:38
    下面我们建立一个动态链接库。 回顾上篇文章讲的建立静态链接库,我们把这几个文件丢到一个新的目录下: makefile tiaoshen.c mmc.h xu.c 你也可以自己建立新的文件,这里不再赘述。 makefile文件中改成 all: ...
  • 使用C语言动态链接库

    千次阅读 2018-04-02 10:21:27
    由于自己一直记不住怎么用C语言生成动态链接库,之前成功的做过一个,由于时间的消逝,记忆也越来越模糊,这两天又拼命查资料,将其完成。遂记录供参之。1. 安装MinGW 我是借助这个软件生成的动态链接库,我打算先...
  • C语言静态/动态链接库的用法小记

    千次阅读 2017-08-11 13:38:20
    0x01 链接库的简单理解与编译库文件简单了说就是包含了别人(或者自己)已经写好的代码,可以直接调用的其内部函数的文件。库文件又包含动态库文件和静态库文件。为什么有静态库和动态库的区别,我简单的介绍一下我...
  • 1、建立动态链接库项目 2、创建头文件和源文件 删除 framework.h、dllmain.c 等现有文件(照顾VS2013等低版本),创建新的头文件 Mydll.cMydll.h Mydll.h头文件代码如下: #include<stdio.h> _...
  • C++在语法上是兼容C的,但是这不代表使用C语言不做任何处理直接写成的动态链接库就可以被C++给调用。由于C++引入了函数重载的机制,而这个机制的实现是在编译器层面的。编译器在“生成”函数符号信息时,不能仅仅...
  • C语言静态链接库和动态链接库讲解及制作使用 1. 引言 静态链接库和动态库均为函数库 函数库:不是C语言的一部分,是一些事先写好的函数的集合,给别人复用 就像scanf和printf函数一样,通过#include <stdio.h>...
  • C调用C++接口,这个问题的解决和C++调用C动态链接库是类似的。话不多说,直接上例子来进行说明。 helloworld_cpp.h文件 #include<iostream> using namespace std; class CHello { private: public: ...
  • C语言源代码编译动态链接库

    万次阅读 2012-02-22 21:14:03
    下面我们举一个例子,用C语言写一个简单的函数,并在控制台(命令行)中将它编译为DLL。 一、源代码 我们创建一个C语言源程序:Test.c 关键:__declspec(dllexport) 申明将这个方法导出到DLL中。 源代码...
  • PAGE / NUMPAGES 近来又有人在群里问如何用c语言编制dll文件动态链接库 原来没有对这个问题太在意过也没有尝试过任何解决方案毕竟原来我是用vb的现在用.net做个dll只不过是点选一下建立activeX?dll工程的图标而已...
  • C语言编译过程以及链接库

    千次阅读 2019-07-09 09:31:19
    预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i) 编译, 检查语法,生成汇编 (test.s) 汇编, 汇编代码转换机器码 ...
  • C语言编译链接过程简介

    万次阅读 2018-05-27 16:56:58
    C语言编译链接过程简介一、编译过程简介 编译过程可以分为4部分内容组成 预处理器-&gt;编译器-&gt;汇编器-&gt;链接器 1、预处理器 (1)、处理所有的注释,以空格代替 (2)、讲所有的#define删除,...
  • 前言最近在使用Java开发过程中,需要使用JNI调用DLL动态链接库,但是动态库源码是使用C语言编写的,遂从网上查找资料,作已记录。编译步骤STEP - 1:新建项目文件–新建–项目–Visual C++模块–Win32–Win32项目–...
  • C语言如何编译动态库与静态

    千次阅读 2017-11-19 16:26:53
    关于动态与静态的作用这里就不在详细赘述了,重点说一下如何编译动态库与静态及使用,一些大型的程序一般拥有着良好的架构,各个功能模块之间能够相互协调工作,达到预期的效果,但有的程序并不是所有的源码都...
  • g++ 编译动态链接库

    2019-08-26 14:41:33
    g++ 编译动态链接库 在linux中动态链接库的后缀为(.so),windows中的后缀为(.dll)mac 中为(.dylib) g++ -shared -fPIC -o ecd.so add.c -share指为共享的,-fPIC表示position independent code位置无关,这是动态...
  • 环境:centos7 写头文件:在测试文件夹test目录下,建立一个mycompute目录,专门用于... 执行时需要通过 -l (小写L)指定使用的动态链接库,需要使用的是libmycompute.so的库,在用 -l 指定的时候只用写mycompute。
  • 在linux下使用jna调用本地方法的时候,需要将C写成的程序编译为so文件 1、写一个简单test.c文件: #include<stdio.h> int add(int a,int b);...2、编译为so动态链接库: gcc -fpic -c te...
  • 函数库有两种提供形式:动态链接库与静态链接库 早起函数库里的函数都是直接共享的,就是所谓的开源社区。后来函数库商业化,就出现了静态链接库与动态链接库。 他们是不直接给客户提供源代码,静态链接库是先将源...
  • C语言编译链接过程详解

    千次阅读 2018-08-04 11:43:31
    我们将对C语言的这种处理过程称为编译链接编译就是把文本形式源代码翻译为机器语言形式的目标文件过程。 链接是把目标文件、操作系统的启动代码和用到的文件进行组织最终形成可执行代码的过程。编译链接...
  • 我在一个目录下新建hello.h hello.c main.c三个文件,我们需要将hello.c文件编译成静态以及动态库。在存放文件目录下打开一个终端。三个文件hello.h(见程序1)为该函数的头文件。 hello.c(见程序2)是函数的源...
  • 五、动态链接     一、程序编译链接的整体流程 通常我们使用gcc来生成可执行程序,命令为:gcc hello.c,默认生成可执行文件a.out 其实编译(包括链接)的命令:gcc hello.c 可分解为如下4个大的步骤: ...
  • 我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。 预处理, 展开头文件/宏...
  • c语言中存在静态(.a)和动态库(.so)。 静态实际上是一些目标文件的集合,只用于链接生成可执行文件阶段。链接器会将程序中使用到函数的代码从文件中拷贝到应用程序中,一旦链接完成生成可执行文件之后,在执行...
  • 最简单的方法当然是使用g++编译C工程,但有时候可能因为一些限制不能使用g++编译,这时候可以考虑把C++代码Make成一个动态库或静态,再在C代码中调用。 如下有一个调用opencv的程序: facedetect.h: #include "cv....
  • 流程: 预处理:展开头文件/宏替换/去掉注释/条件编译 (test.i main .i) 编译:检查语法,生成汇编 (test.s main .s) 汇编:汇编代码转换机器码 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,950
精华内容 17,980
关键字:

c语言编译动态链接库

c语言 订阅