精华内容
下载资源
问答
  • 网上关于C#怎么调用C语言生成的链接库的资料太少了,所以我在这里详细介绍怎么用C语言生成动态链接库,怎么用C#下载。由于C语言生成动态链接库需要使用mingw,所以我从三个部分来介绍。一、下载mingw mingw官网上给...

      网上关于C#怎么调用C语言生成的链接库的资料太少了,所以我在这里详细介绍怎么用C语言生成动态链接库,怎么用C#下载。由于C语言生成动态链接库需要使用mingw,所以我从三个部分来介绍。

    一、下载mingw

      mingw官网上给的安装文件是32位的,由于我的电脑是64位的,所以我下载了一个64位的,结果安装的时候一直不成功,最后我选择了一个GNU工具集合来下载安装mingw,下载地址是http://www.pc6.com/softview/SoftView_56757.html

      下载完成后安装(这个就不具体说了),安装完成后一定要记得将MinGW的安装路径的bin文件夹(例如D:\MinGW\bin)配置在Path环境变量中。

      打开cmd命令程序,输入gcc -v,显示如下,则说明安装成功了


    二、生成C语言动态链接库

     1.首先建立一个C语言源文件test.c

    void swap(int* a, int* b)
    {int c = *a;*a = *b;
    }
    *b = c;

      2.生成.dll文件

      将你建立的test.c文件,复制到mingw安装文件下的bin目录中,打开cmd命令行,输入命令:

    gcc -shared -o test.dll test.c

      此时在这个文件夹(bin)下,有一个test.dll文件,这个就是动态链接库。

        

    三、C#调用动态链接库

    1.建立一个C#控制台程序

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;namespace testC{
    [DllImport("test.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    class Program {
    // [DllImport(PCAP_DLL, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
    public unsafe static extern void swap(int* a, int* b); static void Main(string[] args) {
    unsafe
    int a = 1; int b = 2; Console.WriteLine($"Before Swap a={a},b={b}"); {
    Console.ReadKey();
    swap(&a,&b); } Console.WriteLine($"After Swap a={a},b={b}"); Console.WriteLine("\n");
    }
    }
    }

    注意:DLL导入特性声明了要调用的函数,之后就可以调用这个方法。因为在C#源代码中使用了指针和取地址符号,所以要用unsafe代码块。

    2.将test.dll放在Debug目录下


    3.添加关键字unsafe后的代码会被VS编译环境报错。

    右键菜单栏里面的选项,选择testC属性,这里的testC是我建立的项目名。将我红色圈出的这个打上对勾。


    到此,我们可以成功的运行了。结果如图所示:


    (欢迎大家指正与批评,谢谢)





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

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

    由于自己一直记不住怎么用C语言生成动态链接库,之前成功的做过一个,由于时间的消逝,记忆也越来越模糊,这两天又拼命查资料,将其完成。遂记录供参之。

    1. 安装MinGW

        我是借助这个软件生成的动态链接库,我打算先简单介绍下这个MinGW的安装。

    (1)下载MinGW,官方网址的我没下载成功,我选择了http://dl.pconline.com.cn/download/364149.html下载,安装时会给你推荐各种不需要的软件,可以将对勾取消。

    (2)解压完就直接点安装就可以了。切记安装完一定要把bin文件写入path中,如我将文件保存到了C:\\MinGW中,那么在环境变量path中我加了C:\\MinGW\\bin。

    (3)验证这个软件有没有安装成功,打开cmd,输入gcc -v,如果出现版本信息就说明安装成功了。



    2. C语言编译

    这个就和写正常C语言程序一样,这个可以用main函数,另外注意写for循环时,要在外面定义,不如会报错 error: 'for' loop initial declaration used outside C99 mode。如:for(int i=0;i<10;i++)改成int i=0; for(i=0;i<10;i++)

    3.生成动态链接库

    打开cmd,进入到你的.c文件所在的地址,如下图:


    接下来是输入: gcc -shared -o lms.dll lms.c ,如下图:



    现在我们的C语言生成动态链接库就完成了。

    展开全文
  • 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

     

    展开全文
  • 根据http协议使用curl,从高德地图服务器获取逆地理编码,c语言编写动态链接库对PostgreSQL进行扩展

    流程:
    【1】c语言编写逆地理编码的函数,利用curl库和高德服务器进行地理坐标解析
    【2】gcc生成动态链接库
    【3】postgreSQL中加载动态链接库中的函数
    【4】postgreSQL中将逆地理编码函数的返回类型进行转化
    ===========================================
    【1】c语言编写逆地理编码的函数,利用curl库和高德服务器进行地理坐标解析

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
    
    #include "postgres.h"
    #include "fmgr.h"
    
    #ifdef PG_MODULE_MAGIC
    PG_MODULE_MAGIC;
    #endif
    
    int StringFind(char *pSrc, char *pDst)//字符串位置查找,返回源字符串的位置 
    {  
        int i, j;  
        for (i=0; pSrc[i]!='\0'; i++)  
        {  
            if(pSrc[i]!=pDst[0])  
                continue;         
            j = 0;  
            while(pDst[j]!='\0' && pSrc[i+j]!='\0')  
            {  
                j++;  
                if(pDst[j]!=pSrc[i+j])  
                break;  
            }  
            if(pDst[j]=='\0')  
                return i;  
        }  
        return -1;  
    }  
    
    size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)//回调函数
    {
    strcat((char*)userdata, (char*)ptr);
    return size*nmemb;
    }
    
    char* poi_list(char* longitude, char* latitude) {    //主函数
     
         int mPos = 0;
         int mNewPos = 0;
         char* pResult = NULL;
         char* pDst = "poi_list";
         char  finalResult[5120] = {'\0'};
         int   i = 0; 
         char  strResult[5120] = {'\0'};//结果存储
         char  szpage[256] = "http://ditu.amap.com/service/regeo?";    
         char tempLongitude[25] = "longitude=";
         char tempLatitude[25] = "&latitude=";
         char* pstrLongitude = strcat(tempLongitude,longitude);
         char* pstrLatitude = strcat(tempLatitude,latitude);
         char* locationInfor = strcat(pstrLongitude,pstrLatitude);
         char* myurl = strcat(szpage,locationInfor);
    
         CURLcode res; 
         res = curl_global_init(CURL_GLOBAL_ALL);//初始化
         if (res != CURLE_OK)    
         {    
            pResult = psprintf( "Failed to global init default [%d]\n", res ); 
                 return pResult;   
            
         }  
    
         CURL* pEasyHandle = curl_easy_init(); // 初始化
         curl_easy_setopt(pEasyHandle, CURLOPT_URL, myurl);//传入url
         curl_easy_setopt(pEasyHandle, CURLOPT_WRITEFUNCTION, &write_callback);//调用回调函数
         curl_easy_setopt(pEasyHandle, CURLOPT_TIMEOUT, 10);  
         curl_easy_setopt(pEasyHandle, CURLOPT_FORBID_REUSE, 1);   
         curl_easy_setopt(pEasyHandle, CURLOPT_WRITEDATA, strResult);//参数三对应回调函数的参数四
         res = curl_easy_perform(pEasyHandle);
         curl_easy_cleanup(pEasyHandle);
    
         mPos=StringFind(strResult,pDst);
         mNewPos=mPos+10;//过滤掉location字段
         while(strResult[mNewPos]!='\0')
         {
        
          finalResult[i]=strResult[mNewPos];
          mNewPos++;
          i++;
         }
        i=i-2;
        finalResult[i]='\0';
        
        size_t strLength = strlen(finalResult) + 1;
        pResult = malloc(strLength);
        strcpy(pResult, finalResult);
        
        return pResult;
    }
    【2】gcc生成动态链接库
    hyc@hyc-csu:~/文档/Curl_program$ gcc -fpic -I `pg_config --includedir-server` -c poiOutput.c -lcurl
    hyc@hyc-csu:~/文档/Curl_program$ gcc -fpic -shared -o poiOutput.so poiOutput.o -lcurl
    hyc@hyc-csu:~/文档/Curl_program$ sudo cp poiOutput.so `pg_config --libdir`
    【3】postgreSQL中加载动态链接库中的函数【与MFC(Microsoft Foundation Classes)中的CString类不同,cstring是一种pseudo type,详见文档
    gpsDB=# load 'poiOutput.so';
    LOAD
    gpsDB=# create function poi_list(cstring,cstring)
    returns cstring
    as 'poiOutput.so','poi_list'
    language C immutable strict;
    CREATE FUNCTION
    gpsDB=# select poi_list('118.744607','32.030886');
    【4】postgreSQL中将逆地理编码函数的返回类型进行转化【参数null::poiarray,其中poiarray表结构与json结构相对应,详情点击此处
    gpsDB=# select (select poi_list('112.931850','28.169100'))::json;
    ERROR:  cannot cast type cstring to json    ​//cstring类型转化为text类型,再转化为json类型
    gpsDB=# select * from json_populate_recordset(null::poiarray,(cast((select poi_list('118.744607','32.030886')) as text))::json);
    gpsDB=# select * from json_populate_recordset(null::poiarray,(poi_list('118.744607','32.030886')::text)::json);


    展开全文
  • c语言生成动态库

    万次阅读 2012-06-28 16:47:16
    在Linux中创建静态动态库范例 (hello.c) 0人收藏此文章,我要收藏 发表于2年前 , 已有440次阅读 共0个评论 我们通常把一些公用函数制作成函数,供其它程序使用。 函数分为静态动态库两种。 ...
  • 使用C语言编写代码并生成动态链接库 使用MATLAB调用动态链接库 以一个简单的例子演示并说明整个过程 我使用的环境为: MATLAB R2015a 64bit Visual Studio 2013 64bit 编写你自己的程序并生成动态链接库(.dll) 在...
  • 1、建立动态链接库项目 2、创建头文件和源文件 删除 framework.h、dllmain.c 等现有文件(照顾VS2013等低版本),创建新的头文件 Mydll.cMydll.h Mydll.h头文件代码如下: #include<stdio.h> _...
  • PAGE / NUMPAGES glddydyzcw HU-unix下面java调用C语言动态链接库 我...C语言动态链接库怎么生成需要修改什么配置也就是说java程序怎么才能找到这个动态链接库 我运行的时候出现了这个错误 ?Exception in thread "mai
  • 1.新建一个类test,通过 System.loadLibrary()的方式将so加载进去,注意不要带有lib 和 so 比如libhello....6.将so这个动态链接库push到/system/lib/ 或者 /system/lib64/,要根据手机是32位还是64位来决定。
  • 本文具体讲述了一种C语言调用MATLAB生成动态链接库的方法。
  • 一、函数库简述 简单来说,函数库就是一些事先写好的模块化的函数的集合,可以供给其他程序员使用。...1.1 函数库的提供形式:动态链接库与静态链接库 早期的函数共享都是以源代码的形式进行的,慢慢地,源...
  • 一、生成静态链接库并应用1.首先,创建一个c文件root@ubuntu:~/c# cat fun.c #include&lt;stdio.h&gt; int fun(int a,int b) { return a*b; }root@ubuntu:~/c# cat fun.h #ifndef _FUN_H_ #define _FUN_...
  • 差不多可以认为,每个程序都链接到一个或几个上。...在这些情况中,你必须作出选择:静态(statically)还是动态(dynamically)地将程序链接上。如果你选择了静态链接,程序体积可能会更大,
  • C语言之静态链接库与动态链接库(2)

    千次阅读 2014-02-27 11:44:32
    一、动态链接库(Dynamic Link Library)  动态链接库可以理解为将源代码编译成目标代码后打成的库,该目标代码库可被其他进程在执行时动态调用。DLL 有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL ...
  • C调用C++接口,这个问题的解决和C++调用C动态链接库是类似的。话不多说,直接上例子来进行说明。 helloworld_cpp.h文件 #include<iostream> using namespace std; class CHello { private: public: ...
  • C语言动态链接库

    2020-03-26 21:38:46
    windows windows的动态链接库的后缀名一般叫做dll(Dynamic Link Library)。 以下命令都是在powershell里运行的。 创建mymath.def LIBRARY mymath.dll EXPORTS add sub 得到mymath.exp和mymath.lib 其中mymath.exp...
  • C语言 之建立动态链接库

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

    千次阅读 2011-11-23 08:09:55
    动态链接库(dynamic libs),又称为共享库(shared libs),与静态链接库不同,前者分为两个阶段链接到程序中。第一步,在编译器件,链接器确认程序所需要的标示(包括变量和函数等)包含在程序中,或者是动态链接库...
  • C语言之静态链接库与动态链接库(1)

    千次阅读 2014-02-27 10:52:44
    一、分别编译与链接(Linking) 大多数高级语言都支持分别...在C/C++中,这些独立的编译单元包括obj文件(一般的源程序编译而成)、lib文件(静态链接的函数)、dll文件(动态链接的函数)等。 静态链接方式:在
  • UNIX下C语言动态链接库SO

    千次阅读 2014-07-25 00:32:44
    UNIX下C语言动态链接库SO 2009-11-22 专题 大恒 daheng99@qq.com   相关技术 gcc编译加-fPIC Ø 以动态链接库的形式给出的。所以编译这个库的时候我们需要指定-fPIC,也就是指定生成的代码是位置...
  • dll是windows下的动态链接库文件,下面记录一下在windows下如何调用C语言开发的dll动态链接库。 1.dll动态链接库的源代码 hello_dll.c #include "stdio.h" _declspec(dllexport) void test_print(char const...
  • Linux C语言调用C++动态链接库

    千次阅读 2017-02-15 22:13:22
    Linux C语言调用C++动态链接库 标签: C调用C++库 2014-03-10 22:56 3744人阅读 评论(0) 收藏 举报 分类: 【Linux应用开发】(48) 版权声明:本文为博主原创文章,未经博主允许...
  • 一、Linux下生成动态链接库 //func.c # include <stdio.h> int add(int a , int b) { return a+b; } void func() { printf("hello world......\n"); } 命令行:gcc -shared -fpic -lm -ldl -o libfunc.so...
  • 创建动态链接库DLL 1、首先创建一个新的DLL工程 2、工程中会生成几个自带的文件,注意把后缀cpp改为“c”,为了方便,可以直接在“pch.c”上进行操作。 3、在pch.c文件中编写函数实现的功能,这里我实现一个加法...
  • C语言静态/动态链接库的用法小记

    千次阅读 2017-08-11 13:38:20
    0x01 链接库的简单理解与编译库文件简单了说就是包含了别人(或者自己)已经写好的代码,可以直接调用的其内部函数的文件。库文件又包含动态库文件和静态库文件。为什么有静态库和动态库的区别,我简单的介绍一下我...
  • 一、创建C语言动态链接库 1.建立。 File-&amp;amp;amp;gt;New-&amp;amp;amp;gt;Projects-&amp;amp;amp;gt;Dynamic Link library-&amp;amp;amp;gt;Go 给项目命名为:Dynamic_library 删除项目
  • Linux C语言调用C++动态链接库-改

    千次阅读 2015-04-27 17:39:55
    如果你有一个c++做的动态链接库.so文件,而你只有一些相关类的声明, 那么你如何用c调用呢,别着急,本文通过一个小小的例子,让你能够很爽的搞定.    一、编译生成一个供测试使用的C++动态库: 链接库头文件: //head.h...
  • 函数库有两种提供形式:动态链接库与静态链接库 早起函数库里的函数都是直接共享的,就是所谓的开源社区。后来函数库商业化,就出现了静态链接库与动态链接库。 他们是不直接给客户提供源代码,静态链接库是先将源...
  • C++在语法上是兼容C的,但是这不代表使用C语言不做任何处理直接写成的动态链接库就可以被C++给调用。由于C++引入了函数重载的机制,而这个机制的实现是在编译器层面的。编译器在“生成”函数符号信息时,不能仅仅...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,141
精华内容 14,856
关键字:

c语言生成动态链接库

c语言 订阅