Tags: g++ C++ so library

在Linux系统下用g++命令编译C++程序.也可以生成so,a链接库

示例一 编译时链接so库

Test.h 文件内容

Main.cpp文件内容

命令执行过程

//生成so文件

g++ -shared -fPIC -o libTestLib.so Test.h

//编译Main.cpp并链接so.生成可执行文件Main

g++ Main.cpp -o Main -L.

//执行可执行文件Main

./Main

使用Makefile

Makefile解读

Makefile的基本规则是

生成目标 : 依赖目标

<TAB>命令

Makefile会首先检查生成目标的依赖目标,若所有依赖目标准备好,则执行下一行以<TAB>(制表符)开头的命令,来产生生成目标.

一般来说一个Makefile只有一个最终目标(一般是Makefile定义的第一个).而这个目标可以依赖其他目标,Makefile会自动检查依赖,并且按依赖关系逐个生成

上面Main目标依赖LibTest.so Main.cpp,其中Main.cpp是源文件,不需要生成,而LibTest.so是一个目标,因此Makefile会找到LibTest.so的生成规则,并首先生成LibTest.so再生成最终目标Main

LibTest.so的生成又依赖于Test.h文件,其中Test.h是源文件,所以可以直接利用下面的<Tab>后的命令生成LibTest.so.因此Makefile首先执行的是g++ -shared -fPIC -o LibTest.so Test.h

在生成LibTest.so后,最终目标Main的所有依赖文件已经准备好,则Makefile执行

g++ Main.cpp -o Main -L.

来生成最终目标Main文件

伪目标

Mainfile中的clean也是一个目标,但是并不依赖于任何文件,这种目标称为伪目标,而且应该用

.PHONY: clean

来声明该伪目标.

Makefile的执行:

对于Makefile的最终目标(一般为第一个),可以直接在命令行执行make命令,由Makefile自动识别来执行

也可以使用

make 目标名

来执行指定目标,而对于伪目标clean,则必须使用 make clean的方式显示执行:

make clean

参考

http://blog.csdn.net/haoel/article/details/2887

注意:

-shared 是指生成动态链接库,详细查Google

http://blog.sina.com.cn/s/blog_54f82cc201011op1.html-fPIC 是指编译代码为可共享,参考:

-o 后面为输出文件名称

-L. 是指的在以下位置查找链接库,其中L后面的(.)是指的是当前目录

示例二 代码动态加载库

若要动态加载.so库则需要使用dlopen 等函数

目录结构

Test.h内容

extern "C" {

int TestAdd(int x, int y);

}

Test.cpp内容

#include "Test.h"

extern "C" int TestAdd(int x, int y)

{

return x + y;

}

Main.cpp内容

#include <dlfcn.h>

#include <iostream>

using namespace std;

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

{

void *handle = dlopen("./Test.so", RTLD_LAZY);

if (!handle)

{

cout << dlerror() << endl;

return -1;

}

typedef int (*add_t)(int a, int b);

add_t add = (add_t) dlsym(handle, "TestAdd");

if (!add)

{

cout << dlerror() << endl;

dlclose(handle);

return -1;

}

int a = add(3,5);

cout << "a = " << a << endl;

dlclose(handle);

return 0;

}

Makefile内容:

Main: libTest.so Main.cpp

g++ -ldl -o Main Main.cpp

libTest.so: ./Sources/*.cpp

g++ -shared -fPIC -o libTest.so ./Sources/*.cpp -I ./Headers/

.PHONY: clean

clean:

-rm -f Main

-rm -f libTest.so

注意:

1.

不管什么库文件,你都既要在包含.h文件(不然编译通不过:有未声明的函数),也要在gcc选项里面指定.so文件的位置(不然链接通不过:未知的符号) 比如 gcc -I include_path -L lib_path -lyourlib include_path改成你头文件的目录 lib_path改成你动态库文件的目录 -lyourlib 改成l加上你要引用的库文件名字 比如libpthread.so就改成-lpthread

http://blog.chinaunix.net/uid-21273878-id-4148042.html

示例三 Linux下Eclipse 中调用so文件

首先在Linux下安装Eclipse,确保jdk环境都配置ok

创建Eclipse工程,创建java代码源文件

TestLib.java

public class TestLib {

static{

System.loadLibrary("Test");

}

public static native int TestAdd(int a, int b);

public static void main(String args[])

{

System.out.println(TestAdd(1, 2));

}

}

在TestLib.java文件目录下,使用javac命令生成TestLib.class文件

javac TestLib.java

在bin目录下,找到生成的TestLib.class 文件(若没有该文件,则在TestLib.java相同目录下找,并复制到bin目录下.

在bin目录下,执行以下命令生成C++工程使用的TestLib.h文件

javah -classpath . -jni TestLib

生成的TestLib.h

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class TestLib */

#ifndef _Included_TestLib

#define _Included_TestLib

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: TestLib

* Method: TestAdd

* Signature: (II)I

*/

JNIEXPORT jint JNICALL Java_TestLib_TestAdd

(JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus

}

#endif

#endif

创建C++代码Test.cpp,实现TestLib.h中定义的各接口:

Test.cpp

include "TestLib.h"

JNIEXPORT jint JNICALL Java_TestLib_TestAdd

(JNIEnv *env, jclass cls, jint a, jint b)

{

return a + b;

}

编写Makefile

Makefile 内容

libTest.so: ./Sources/*.cpp

g++ -shared -fPIC -o libTest.so ./Sources/*.cpp -I ./Headers/ \

-I /usr/lib/jvm/java-1.7.0-openjdk.x86_64/include \

-I /usr/lib/jvm/java-1.7.0-openjdk.x86_64/include/linux

命令行执行 make libTest.so

生成libTest.so文件,将so文件拖到Eclipse项目中.运行Eclipse项目.

正确调用libTest.so中定义的接口

注意:

生成的TestLib.h包含了jni.h文件,而且需要jni_md.h文件.所以在g++命令时,需要用 -I 参数指定这两个头文件的路径

转载于:https://www.cnblogs.com/wmalloc/p/7232770.html

g++ 生成C++ .so库文件,并调用示例相关推荐

  1. C++编写库文件以及调用

    我们在日常编码中,可能会出现这样一种情况:我们要将我们写好的函数或者类提供给别人,但是我们只想给他提供接口而不想让他了解到函数的具体细节.这时我们可以将我们的函数封装成库然后和头文件一起提供给他,这样 ...

  2. vue怎么自己创建组件并引用_如何在组件库项目内直接引用vue-cli生成的组件库文件...

    感谢大家帮忙, 我第一次用vue-cli制作组件库,使用的命令是: vue-cli-service build --target lib --name vpui ./src/components/in ...

  3. java 生成.sh文件,Java 生成Bat或SH文件,调用Sqlldr安插数据到Oracle

    执行流程: 1.从ftp判断文件是否存在 2.下载文件 3.创建ctl文件 4.创建可执行文件,bat或sh文件,文件中是sqlldr命令代码 5.备份表并创建临时表 6.执行文件,插入数据 7.检查 ...

  4. Linux静态库.a与动态库.so的生成与区别、以及.so库文件的封装与使用

    #一.前言 如果有公司需要使用你们产品的一部分功能(通过代码调用这些功能),如果不想提供源代码,那么就可以通过封装成库文件的形式提供给对方使用.本文主要介绍了生成动态库与静态库文件的过程.以及封装和使 ...

  5. linux下Qt调用C++库文件(.so)程序实现

    文章目录 主要内容 一.编程环境及实现方法 二.项目实现 1.创建项目 2.导入库文件 三.项目中遇到的问题 总结 主要内容 如标题所示,在linux下使用qtcreator创建项目调用C++库文件, ...

  6. matlab将脚本导出动态库文件.dll,并被python调用

    文章目录: 一.matlab将脚本生成动态库.dll文件 1.1 编写简单的脚本函数 1.2 生成dll文件 二.python调用.dll 所使用的的环境如下: 系统:windows10 matlab ...

  7. 头文件和库文件区别,动态库和静态库的区别,动静态库的生成

    文章目录 一.什么是头文件?什么是库文件?有什么区别? 先说总结 目标文件 二.什么是静态库?什么是动态库?有什么区别? 三.为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明 ...

  8. 在.c文件中调用cuda函数

    在.c文件中调用cuda函数 2014-04-19 17:17 446人阅读 评论(0) 收藏 举报 分类: cuda编程(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. 问题描述:假设在 ...

  9. 简述linux中动态库和静态库的制作调用流程

    假设现在有这些文件:sub.c add.c div.c mul.c mainc head.h(前4个.C文件的头文件) 1.静态库制作流程         gcc -c  sub.c add.c di ...

最新文章

  1. spring mvc 与Struts的认识
  2. iOS-设计模式-观察者模式-KVO
  3. 【机器学习入门笔记8:TensorFlow运算实质】20190216
  4. C# WebAPI设置跨域
  5. Gym - 101173H Hangar Hurdles(bfs+克鲁斯卡尔重构树)
  6. Spark SQL(八)之基于物品的相似度公式
  7. 图片大小 媒体大小自适应_自适应堆大小
  8. 人人都是程序员?一边吐槽,一边却偷偷用,低代码工具真香
  9. pantone潘通色卡对照表_赶快收藏!快速对色必备:潘通色卡电子版(一)1TPX~113TPX...
  10. 37. 错误与异常处理(1)
  11. Java定时任务自动调用方法
  12. 秒杀系统设计与关键技术剖析
  13. 程序设计-股票最大收益问题(Java)
  14. 3D打印:FDM打印湿度对打印件及打印机的影响和调整
  15. [TJOI2019]唱、跳、rap和篮球 题解
  16. 激光SLAM技术总结(3)3D激光SLAM算法原理
  17. marker 头像 高德地图_高德地图头像怎么更换 高德地图更换头像图文教程
  18. 2019年给Java编程初学者的建议(附学习大纲)
  19. NFC通信基本原理 主动和被动通信
  20. 3DMAX快速入门 界面介绍【上】

热门文章

  1. 清华「计图」现在支持国产芯片了!动态图推理比PyTorch快了270倍
  2. 可以在手机里运行的Detectron2来了:Facebook官方出品,支持端到端模型训练、量化和部署...
  3. 我一个普通程序员,光靠GitHub打赏就年入70万,要不你也试试
  4. 网红送餐无人车被指用人冒充AI始末:没有人工,就没有智能
  5. 五道java小题,补更四道java小题
  6. 20155222 2016-2017-2 《Java程序设计》第10周学习总结
  7. C#学习笔记——密封类与密封方法
  8. 【推荐】R for Data Science 新书抢先看
  9. Asynchronous CDI Events
  10. Unity 编辑器扩展 场景视图内控制对象