非标准c库函数->封装成库

简介: 非标准c库函数->封装成库

1.当有c语言源代码可以直接编译


calc.h


#ifndef _CALC_H
#define _CALC_H
int add(int a, int b);
int sub(int a, int b);
#endif


calc.c


#include "calc.h"
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}


main.cpp


#include <iostream>
#include "calc.h"
int main(void)
{
int a=0,b=0;
std::cin>>a>>b;
int c = add(a,b);
std::cout<<c<<std::endl;
return 0;
}


目录结构如下



编译:当有c语言源代码可以直接编译


换句话说就是.c和.h .cpp在同一层目录下


在ubuntu16.04运行



格式:


g++(空格)文件名.cpp(空格)文件名.c(空格)-o(空格)输出文件名


g++ main.cpp calc.c -o main #有c源代码的时候添加头文件不能用extern "C"
{#include"calc.h"}


2.当没有c语言源代码只有c的库不能直接编译


1.把c语言源代码编译成库


先把C语言源文件封装成后缀为 .so 文件


gcc -o libcalc.so -shared -fPIC calc.c


2.编译c++程序使用c库


要修改main.cpp


#include <iostream>
extern "C" //表示里面的函数是c语言编写并且已经编译成库
{
#include "calc.h"
}
int main(void)
{
int a=0,b=0;
std::cin>>a>>b;
int c = add(a,b);
std::cout<<c<<std::endl;
return 0;
}


现在文件目录结构如下


calc.h libcalc.so main.cpp



g++ -o main main.cpp -L./ -lcalc


#-L后是库所在的路径, -l后面接库名 ,比如libcalc.so库名就是calc



但是在这里编译完成后还是不能运行,需要添加运行路径


export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)



成功运行

相关文章
|
6月前
|
Windows
VBA的直接或间接调用的语法格式
VBA|过程或方法内部的直接或间接调用与相对怪异的语法格式
|
6月前
|
存储 Java C#
C++语言模板类对原生指针的封装与模拟
C++|智能指针的智能性和指针性:模板类对原生指针的封装与模拟
|
7月前
|
编译器 API C语言
在x86架构汇编语言中函数参数传递的三种约定
在x86架构汇编语言中函数参数传递的三种约定
204 2
|
7月前
|
C语言 索引
基于C语言的函数指针应用-消息命令处理框架
基于C语言的函数指针应用-消息命令处理框架
40 0
|
7月前
|
编译器 API C++
【C++ 动态库设计】动态库中的模板函数:解决如果将模板函数封装成API库
【C++ 动态库设计】动态库中的模板函数:解决如果将模板函数封装成API库
300 0
C4.
|
7月前
|
Python
Phython函数封装
Phython函数封装
C4.
43 0
|
7月前
|
前端开发 程序员 开发者
自己封装的一些工具函数
自己封装的一些工具函数
|
7月前
|
编译器 C语言
C语言中函数宏的三种封装方式详解
C语言中函数宏的三种封装方式详解
106 0
|
C语言
C语言中如何实现数据帧封装与解析
在计算机网络通信中,数据帧的封装与解析是非常重要的环节。本文将介绍一种基于C语言的实现方法,旨在帮助读者理解数据帧的结构和实现过程。
274 1
|
C语言
【文件处理】C语言引用外部文件教程
【文件处理】C语言引用外部文件教程
293 0