怎么将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语言的简单介绍 相关内容,内容如下。   制作灰鸽子是学什么语言程序   灰鸽子客户端和服务端都是采用Delphi编写。黑客利用客户端程序配置出…

    2020年4月22日
  • 流水灯c语言程序crol,keil流水灯c语言程序

    流水灯c语言程序crol,keil流水灯c语言程序 大家并不陌生,借来给大家详细说说吧!   流水灯C语言程序,要通俗易懂版的   用精确定时的方法,设置流水灯运行时的时间间隔,延…

    2020年11月30日
  • 排列组合公式c语言

    关于排列组合公式c语言话题,今日,嗨壳技术分享网小编抽出大半天的时间整理一些排列组合公式c语言内容,让我们一起了解一些技术吧!   c怎么算排列组合   组合数公式C=C(n,m)…

    2020年4月27日
  • 基于栈实现的迷宫问题c语言程序设计

    基于栈实现的迷宫问题c语言程序设计   C语言编程 迷宫问题(队列)   c#界面绘制的时候,底层重绘每次会清除画布背景,然后再全部重新绘制,这才是导致闪烁最主要的原因。于是重载消…

    2023年10月10日
  • 计算机二级c语言精讲班,计算机二级c语言网课

    计算机二级c语言精讲班,计算机二级c语言网课   计算机二级c语言培训班一般上多长时间课?   没有问题,我有一个老师是做二级C语言培训的,他培训C语言要上30天的课,每天3个小时…

    2020年1月9日
  • 用c语言打开图片(c语言打开图片的源代码)

    今日,嗨壳技术分享网小编分享用c语言打开图片(c语言打开图片的源代码) 相关内容,内容如下。   本篇文章给大家谈谈用c语言打开图片,以及c语言打开图片的源代码对应的知识点,希望对…

    2020年3月23日
  • c语言定义中文字符串(c语言如何定义中文字符串)

    c语言定义中文字符串(c语言如何定义中文字符串)   今天给各位分享c语言定义中文字符串的知识,其中也会对c语言如何定义中文字符串进行解释,如果能碰巧解决你现在面临的问题,别忘了关…

    2020年3月26日
  • 机器人巡线c语言(机器人巡线的原理)

    关于机器人巡线c语言(机器人巡线的原理)话题,今日,嗨壳技术分享网小编抽出大半天的时间整理一些机器人巡线c语言(机器人巡线的原理)内容,让我们一起了解一些技术吧!   本篇文章给大…

    2020年1月5日
  • rsa加密c语言,c++ rsa加密

    rsa加密c语言,c++ rsa加密 大家并不陌生,借来给大家详细说说吧!   编一个简单的C语言小程序。。。关于RSA算法的   1、加密的时候,输入Y,然后输入要加密的文本(大…

    2023年11月18日
  • 代码排查工具c语言,c语言代码注释工具

    针对代码排查工具c语言,c语言代码注释工具的内容, 嗨壳技术分享网今天给大家作出详细的解答吧!   C++静态代码检查工具?   Klocwork:Klocwork是一款面向C、C…

    2021年1月7日

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

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


找黑客帮忙一般要多少钱

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


1.攻击服务:


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


。1

2.特定账户的售价:


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

3.攻击工具:

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

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

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

5.DDOS攻击的报价:

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

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