生成并调用so动态库
本文更新于2019-01-03。
生成库
头文件fn.h如下:
#ifndef __FN_H__
#define __FN_H__
#ifdef __cplusplus
extern "C"
{
#endif
typedef int (*FnAdd)(int a, int b);
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif // __FN_H__
源文件fn.c如下:
#include "fn.h"
int add(int a, int b) {
return a+b;
}
编译生成libfn.so库:
gcc -fPIC -shared fn.c -o libfn.so
若不使用extern "C",且使用g++编译或使用gcc编译cpp文件,则生成C++形式的库。
调用库
源文件main.c如下:
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "fn.h"
int main() {
void* handle = dlopen("./libfn.so", RTLD_LAZY);
if (handle == NULL) {
printf("dlopen: %s\n", dlerror());
return -1;
}
FnAdd add = (FnAdd)dlsym(handle, "add");
if (add == NULL) {
printf("dlsym: %s\n", dlerror());
return -1;
}
int a = 1;
int b = 2;
printf("add %d+%d=%d\n", a, b, add(a, b));
dlclose(handle);
return 0;
}
编译生成可执行文件a.out:
gcc -rdynamic -ldl main.c -o a.out
如使用dlopen调用库时没指定库文件路径,只指定库文件名(如libfn.so),则执行程序前需导出环境变量LD_LIBRARY_PATH,将库文件所在目录加入其中。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:dir
生成并调用so动态库的更多相关文章
- Android项目中JNI技术生成并调用.so动态库实现详解
生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配 ...
- JNI_Android项目中调用.so动态库
JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 參考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者 ...
- .netcore在linux下使用P/invoke方式调用linux动态库
http://www.mamicode.com/info-detail-2358309.html .netcore下已经实现了通过p/invoke方式调用linux的动态链接库(*.so)文件 1 ...
- CVI中调用VC动态库
1.在VC环境中建立新工程,创建32位动态库(Win32 Dynamic-Link Library) -> A simple DLL project 2.在工程中可加入别的动态库,在工程菜单中 ...
- c#调用c++动态库的一些理解
调用c++动态库一般我们这样写 [DllImport("UCamer.dll", CallingConvention = CallingConvention.Winapi)] ...
- C#调用C++动态库(dll)
在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可以利用re ...
- C#总结(四)调用C++动态库
由于公司很多底层的SDK,都是C++开发,上层的应用软件却是C# Winform程序.在实际工作的过程中,就经常碰到了C# 程序调用C++ 动态库的问题.最近一直在和C++ 打交道,C# 怎么调用C+ ...
- Java调用dll动态库
最近项目里使用java调用dll动态库,因此研究了一下这方面的东西. 使用的工具包如下 <dependency> <groupId>net.java.dev.jna</g ...
- 【C#】 使用Gsof.Native 动态调用 C动态库
[C#] 使用Gsof.Native 动态调用 C动态库 一.背景 使用C# 开发客户端时候,我们经常会调用一些标准的动态库或是C的类库.虽然C# 提供的PInvoke的方式,但因为使用的场景的多变, ...
随机推荐
- 申请MVP奖励时的小Tips
大家新年好,今天MSPrecious为大家带来一些申请MVP奖励时的小Tips. 本文分为三个部分 MVP是什么 如何申请MVP 申请MVP需要注意的事项 MVP是什么? 我想,点进来看这篇文章的 ...
- [T-ARA][그녀를 보면][看着那个女人的话]
歌词来源:http://music.163.com/#/song?id=29343995 作曲 : 코난 [作曲 : Ko-nan] 作词 : 코난/로코 [作词 : Ko-nan-/lo-Ko] b ...
- Python 及其基础语法
重新开始玩 Python,打算就是学完实验楼的"Python3 简明教程",然后就可以玩点小项目,先前学了点 Python2 就不管它啦. 以上. 认识 Python Python ...
- 导出当前域内所有用户hash的技术整理
0x00目标: 导出当前域内所有用户的hash 0x01测试环境: 域控:server2008 r2 杀毒软件:已安装* 域控权限:可使用net use远程登陆,不使用3389 0x02测试方法: ( ...
- iOS NSRunloop的简单理解
最近学习了下NSRunloop. 作一下简单的理解: 1.runloop与线程的关系,每一个线程创建是都会有伴有一个runloop诞生,runloop用来接收事件源,让线程执行事件.当没有事件处理时, ...
- git修改远程仓库
三种方式都可以. 1. 修改命令 git remte origin set-url URL 2.先删后加 git remote rm origin git remote add origin git@ ...
- 4种方法获取select下拉框标签中的值
选中下拉框中“上海” 代码如下:<select id="province" class="select" name="province" ...
- DataFrame 加减乘除
headlist = ['a', 'b'] datalist = [[1, 2], [0,3], [3,2]] df = pd.DataFrame(data=datalist,columns=head ...
- 为何.NET Core控制台项目发布后是一个dll文件,而不是exe文件?
项目中有一个.NET Core控制台项目叫ConsoleCoreApp,写好代码后准备发布: 结果发布后生成的是一个dll文件...为不是一个exe的可执行文件: 后来了解到.NET Core的项目分 ...
- leetcode -50. Pow(x, n) Accepted
前言:其实之前自己也有了解关于算法数据结构的一点内容,但是都是用相应的开发工具来写相应的代码,今天面试的时候直接leetcode来写代码,还是用的体内根深蒂固的C和Java来解的题,毕竟目前没见支持O ...