怎么将c语言封装成库

今天,嗨壳技术分享网给大家整理一些怎么将c语言封装成库内容。

  如何用C语言封装 C++的类,在 C里面使用

  C一般不能直接调用C++函数库,需要将C++库封装成C接口后,才可以使用C调用。

  下面举例,说明一个封装策略:

  //code in add.cxx

  #include “add.h”

  int sample::method()

  {

  cout”method is called!

  ”;

  }

  //code in add.h

  #include

  using namespace std;

  class sample

  {

  public:

  int method();

  };

  将上面的两个文件生成动态库libadd.so放到 /usr/lib目录下,编译命令如下:

  sudo g++ -fpic -shared -g -o /usr/lib/libadd.so add.cxx -I

  由于在C中不能识别类,所以要将上面类的成员函数,要封装成C接口函数才能被调用。下面进行封装,将输出接口转换成C接口。

  //code in mylib.cxx

  #include “add.h”

  #ifndef _cplusplus

  #define _cplusplus

  #include “mylib.h”

  #endif

  int myfunc()

  {

  sample ss;

  ss.method();

  return 0;

  }

  //code in mylib.h

  #ifdef _cplusplus

  extern “C”

  {

  #endif

  int myfunc();

  #ifdef _cplusplus

  }

  #endif

  在linux下,gcc编译器并没用变量_cplusplus来区分是C代码还是C++ 代码(没有宏定义),如果使用gcc编译器,这里我们可以自己定义一个变量_cplusplus用于区分C和C++代码,所以在mylib.cxx中定义 了一个变量_cplusplus用于识别是否需要“extern “C””将函数接口封装成C接口。但是如果使用g++编译器则不需要专门定义_cplusplus,编译命令如下:

  g++ -fpic -shared -g -o mylib.so mylib.cxx -la -I

  main.c

  #include

  #include

  #include “mylib.h”

  int

  main()

  {

  int (*dlfunc)();

  void *handle; //定义一个句柄

  handle = dlopen(“https://www.easyaq.com/post/mylib.so”, RTLD_LAZY);//获得库句柄

  dlfunc = dlsym(handle, “myfunc”); //获得函数入口

  (*dlfunc)();

  dlclose(handle);

  return 0;

  }

  编译命令如下:

  gcc -o main main.c -ldl

  下面就可以执行了。

  需要说明的是,由于main.c 和 mylib.cxx都需要包含mylib.h,并且要将函数myfunc封装成C接口函数输出需要“extern “C””,而C又不识别“extern “C””,所以需要定义_cplusplus来区别处理mylib.h中的函数myfunc。

  在main.c的main函数中直接调用myfunc()函数也能执行,这里介绍的是常规调用库函数的方法。

  C语言:如何自己做库函数?

  简单的一个例子,但是基本的程序编译的思想都在里面了,具体的需要你自己体会和查资料

  跟着下面的步骤走

  ------------------------

  第一步:我的电脑-属性-高级-环境变量

  添加3个变量

  1.名字:path 值:vc的安装目录里面包含cl.exe的bin目录路径+”;”+vc目录下包含mspdb80.dll的目录的路径

  比如我的是D:Program FilesMicrosoft Visual Studio 8VCbin;D:Program FilesMicrosoft Visual Studio 8Common7IDE;

  2.名字:include 值:vc安装目录下的include目录,主要是为了找到头文件,我的是D:Program FilesMicrosoft Visual Studio 8VCinclude;D:Program FilesMicrosoft Visual Studio 8VCPlatformSDKInclude;

  3.名字:lib 值:vc目录下包含库文件的目录路径

  我的是D:Program FilesMicrosoft Visual Studio 8VClib;D:Program FilesMicrosoft Visual Studio 8VCPlatformSDKLib;

  第二步:需要下面两个文件

  //————-libdemo.c

  #include stdio.h

  void lib_func()

  {

  printf(“this routine in lib

  ”);

  }

  //————main.c

  void lib_func();

  int main(int argc, char *argv[])

  {

  lib_func();

  }

  第三步:命令

  cl /c libdemo.c ‘编译libdemo.c 生成libdemo.obj

  lib libdemo.obj ‘生成libdemo.lib 库文件

  cl /c main.c ‘编译main.c

  link main.obj libdemo.lib ‘生成main.exe

  —————————————————

  呵呵 加点东西,参看4楼的建议,在做个dll,COM组件就不做了,有点复杂了

  1。把libdemo.c 稍微改下

  //————-libdemo.c

  #include stdio.h

  __declspec (dllexport) void lib_func()

  {

  printf(“this routine in lib

  ”);

  }

  2。命令

  cl /c libdemo.c main.c

  link libdemo.obj /dll ‘生成libdemo.lib

  link main.obj libdemo.lib

  C语言中如何将自己常用的函数封装到编译器的库函数中具体应该怎么做呢?

  用编译器提供的库管理工具。

  C语言的编译器都会提供一个命令行工具,可以把自己编译后的.obj模块加入指定的库文件,以后使用时只需要连接该库文件即可。这个命令行工具通常是lib.exe,用这个工具可以查看库中的模块,可以把模块加入到库中,可以从库中删除模块。这个工具不仅仅是自己建立的库文件的管理工具,可以管理所有的库文件,包括C语言提供的标准库。

  如何制作一个c语言函数库

  一、lib库的创建;

  建议使用VC来制作比较方便,以VC2005为例:

  新建》项目》Win32控制台应用程序》静态库》完成。

  然后在里面编写一个函数,编译一下库就作好了。

  把对外使用的函数新建一个头文件声明;

  二、lib库的使用

  新建一个程序,然后引用上面的头文件,就可以使用库里的函数。然后把lib库在工程配置里面加入:属性》链接器》输入》附加依赖项》填入你的lib库,可以加路径。然后编译应该就可以了。

  祝 你 好 运!

  如何将c程序封装为DLL

  用VC编写DLL教程

  用Visual Sudio 6.0新建一个工程,工程的类型选择Win32 Dynamic-Link Library.工程名任意,其他所有选项取默认

  新建一个cpp文件,代码如下:

  int add(int a ,int b){

  return a+b;

  }

  如果工程类型是Win32 Console Application,那么在编译链接以后,会产生一个Debug目录,并且里面有一个exe文件

  这里我们的工程类型是Win32 Dynamic-Link Library,在编译链接以后,我们期望产生一个Debug目录,并且里面有一个dll文件

  事实正是如此

  我们可以用depends工具打开这个dll文件以查看它导出了什么函数

  depends工具在Tools菜单下.实际上它是D:Program FilesMicrosoft Visual StudioCommonTools下的一个文件

  我们发现,这个dll没有导出任何东西

  这是因为我们并没有说明我们要导出的东西.在那个cpp里的函数并不是默认会被导出的.因为它们可能只是被我们要导出的函数的调用的”内部函数”.

  要导出一个函数,我们须要加上_declspec(dllexport),代码变为:

  int _declspec(dllexport) add(int a ,int b){

  return a+b;

  }

  再链接一次

  再查看该dll文件,发现有一个?add@@YAHHH@Z的函数.好像很怪,不过总算看到东西了

  现在来测试一下这个dll

  新建一个工程,类型选Win32 Console Application

  新建一个cpp文件,代码如下

  #include iostream.h

  #include Windows.h

  void main(){

  typedef int (*ADD)(int ,int);//函数指针类型

  HINSTANCE Hint = ::LoadLibrary(“DLL.dll”);//加载我们刚才生成的dll

  ADD add = (ADD)GetProcAddress(Hint,”add”);//取得dll导出的add方法

  coutadd(3,4)endl;

  }

  其中LoadLibrary都是Windows.h里面声明了的函数

  编译链接,都没问题

  运行.出错了!

  分析一下,程序怎么知道去哪里找我们的dll呢?

  它会按如下顺序搜索:当前可执行模块所在的目录,当前目录, Windows 系统目录,Windows 目录。GetWindowsDirectory 函数检索此目录的路径,PATH 环境变量中列出的目录。

  所以我们要把我们的dll复制一份到这个测试工程的Debug目录之后,再运行

  还是出错了!

  分析一下.我们刚才看到的是一个叫?add@@YAHHH@Z函数.那么,是不是这个原因呢?

  把代码改为:

  #include iostream.h

  #include Windows.h

  void main(){

  typedef int (*ADD)(int ,int);//函数指针类型

  HINSTANCE Hint = ::LoadLibrary(“DLL.dll”);//加载我们刚才生成的dll

  ADD add = (ADD)GetProcAddress(Hint,”?add@@YAHHH@Z”);//取得dll导出的add方法

  coutadd(3,4)endl;

  }

  再编译链接,运行,成功了!

  那么怎么可以正确导出我们函数的名字呢?

  在生成dll的工程的代码加上extern “C”,改为:

  extern “C” int _declspec(dllexport) add(int a ,int b)…{

  return a+b;

  }

  编译链接后,查看dll文件,可以看到导出的函数变为add了

  这时下面代码可以正常工作了

  #include iostream.h

  #include Windows.h

  void main()…{

  typedef int (*ADD)(int ,int);//函数指针类型

  HINSTANCE Hint = ::LoadLibrary(“DLL.dll”);//加载我们刚才生成的dll

  ADD add = (ADD)GetProcAddress(Hint,”add”);//取得dll导出的add方法

  coutadd(3,4)endl;

  }

  除了用_declspec(dllexport)指明要导出的函数,用extern “C”来纠正名字,我们还可用一个.def文件来达到以上目的

  在dll工程里新建一个文件,类型选Text File,在名字要带上后缀.def

  内容如下:

  LIBRARY

  EXPORTS

  add

  剩下的步骤就和之前一样了

  用def文件还可以改变导出的函数的名字,例如

  LIBRARY

  EXPORTS

  myadd = add

  使得导出的函数叫myadd,而不是add

  还可以给函数指定一个序号

  如:

  LIBRARY

  EXPORTS

  myadd=add @4

  给myadd指定了一个序号

  在测试工程里,可以根据序号取得我们的函数:

  #include iostream.h

  #include Windows.h

  void main(){

  typedef int (*ADD)(int,int);

  HINSTANCE hInstance=::LoadLibrary(“DLL.dll”);

  ADD add=(ADD)GetProcAddress(hInstance,MAKEINTRESOURCE(4));//根据序号取得函数

  coutadd(3,4)endl;

  add=(ADD)GetProcAddress(hInstance,”myadd”);//在def文件里指定的名字

  coutadd(3,4)endl;

  FreeLibrary(hInstance);//释放加载了的dll文件占的资源

  }

  以上讲的是运行时动态加载dll,下面讲启动时动态加载dll

  产生dll的工程不用变,还是上面这个(名字是myadd,序号为4)

怎么将c语言封装成库

  测试代码改为:

  //先把DLL.lib文件复制到本工程目录里

  #include iostream.h

  #pragma comment(lib,”DLL.lib”)

  extern int myadd(int ,int );//没有加这句而只加上面这句(或在工程设置里加上DLL.lib)会链接错误

  void main()

  {

  coutmyadd(3,4)endl;

  }

  这种方法调用dll,在链接的时候,会在我们exe里包含要引用的符号,在启动程序的时候就会加载所有需要的dll.(之前说错了,说这是静态链接)

  #pragma comment(lib,”DLL.lib”)指明了用到哪个dll,其中DLL.lib可以在Debug找到.我们也要把DLL.lib复制到测试工程目录(不是Debug目录).我们也可以在工程属性里添加.方法是Project–Settings–Link,在Object/libraries Modules最后加上 DLL.lib

  extern int add(int ,int );指明了我们的add是一个外部函数,而不是在本文件定义的

  最后,强调一下,要把该复制的文件复制到正确的地方.

  当你产生的dll文件和我说的不一致时,试一下选Build-Rebuild All

对于【 怎么将c语言封装成库 】文章有相关疑问,还可以参考嗨壳技术分享网,其他技术类文章吧!

原创文章,作者:语言我知,如若转载,请注明出处:https://www.heikehao.com/10967.html

(0)
语言我知语言我知
上一篇 2020年5月8日
下一篇 2020年5月8日

相关推荐

  • 单片机c语言编程入门基础知识

    C语言是一种中级语言,易于移植,既具有高级语言的通用性及易写易读的特点,又具有汇编语言的”位处理”、“地址操作”等能力,允许直接访问无力物理地址…

    2023年12月20日 C语言
  • 高精度整型c语言

    关于高精度整型c语言话题,今日,嗨壳技术分享网小编抽出大半天的时间整理一些高精度整型c语言内容,让我们一起了解一些技术吧!   c语言高精度加法 :输入两个整数a和b输出这两个整数…

    2020年4月2日
  • 黑客攻击软件学习图片高级,黑客攻击软件有哪些

    今日,嗨壳技术分享网小编分享黑客攻击软件学习图片高级,黑客攻击软件有哪些 相关内容,内容如下。   如何应对黑客攻击提高网站安全性   使用防火墙和安全软件:安装和配置防 火墙、反…

    2020年3月9日
  • 高斯平滑滤波c语言

    今日,嗨壳技术分享网小编分享高斯平滑滤波c语言 相关内容,内容如下。   对图像进行高斯滤波使用什么算子   为了便于直观感受高斯滤波的效果,使用Canny算子来提取轮廓对比,你可…

    2020年1月12日
  • 爱园c语言,c语言ai算法

    爱园c语言,c语言ai算法   谁能帮我指点一下下面这些关于美学的题目   1、柏拉图的美学观点属于表现论范畴。×(本体论)鲍姆加敦是现代美学之父。×(是美学之父)康德首先提出了A…

    2022年5月7日
  • c语言如何读取一行数字,c语言如何读取电脑时间

    今日,嗨壳技术分享网小编分享c语言如何读取一行数字,c语言如何读取电脑时间 相关内容,内容如下。   c语言怎样按行读取   1、C语言中,使用fgets函数遍可以一行行读取文件。…

    2020年7月5日
  • 怎么联系大户追款

    标题:如何与大户追款?掌握这些技巧,让你的钱财不再飞走!引人入胜:大户追款,这似乎是一个神秘而又令人好奇的话题。在商业世界中,与大户进行交易是一种常见的方式,当我们的钱财因为各种原因没有及时到账时,我们该怎么办呢?本文将为您揭示一些独特而又实用的方法,帮助您与大户追回欠款!反映主

    2024年3月28日
  • visualstudio编译c语言,visualstudio如何编译

    visualstudio编译c语言,visualstudio如何编译 大家并不陌生,借来给大家详细说说吧!   如何使用visualstudio2017编写c程序?   1、VS …

    2021年8月18日
  • 统计字母个数c语言,统计单词中字母个数的c语言编程

    今天,嗨壳技术分享网给大家整理一些统计字母个数c语言,统计单词中字母个数的c语言编程内容。   在c语言中怎么统计数字字符字母个数   1、s=90)))ZiMu++;else Q…

    2020年1月12日
  • arm汇编转c语言

    arm汇编转c语言   今天给各位分享arm汇编转c语言的知识,其中也会对arm汇编转c语言工具进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!   本文目录…

    2020年2月26日

网上怎么找黑客帮忙多少钱

怎么网上找到的黑客?黑客的收费标准是什么呢?找黑客一般费用是多少?


找黑客帮忙一般要多少钱

黑客服务的价格范围很广,主要取决于服务的类型和难度。根据提供的信息如下:


1.攻击服务:


攻击范围:这包括了通过扫描入侵、种植木马等方式对他人计算机实施非法控制,并利用被控制的计算机对网站、App等服务器发起攻击


。1

2.特定账户的售价:


账户信息:如垂钓者、而勒索软件,显示市场对特定黑客工具的需求和价格波动。

3.攻击工具:

“RIG”攻击工具包的租用费用,提供了不同时长的选择。

4.远程访问木马(RAT)的价格:

相比去年有所下降,显示出市场价格的波动。

5.DDOS攻击的报价:

DDOS攻击服务按不同时长定价选择。

黑客服务的价格因服务类型、难度、以及市场需求的不同而有很大的差异。这些价格反映了黑客服务市场的复杂性和多样性,同时也提醒人们网络安全的重要性。