动态库

不依赖插件 给 Unity 项目接入 Lua

三世轮回 提交于 2020-01-20 18:45:32
之前在公司给项目接入过 xLua .接入过程非常傻瓜. 又了解到 Unity 由于历史原因,有各种各样的 lua 接入插件。 slua,xlua,tolua 等等层出不穷。 如果是为了直接在 Unity 项目里使用 Lua,使用现成的插件肯定是最好的选择。如果是为了学习,就需要自己亲手实践一番 之前并不了解 unity 接入 lua 的原理 。 最近通过公司的项目,查阅看官方文档,了解到 Unity 能够使用 C# 代码调用 C++ 写的动态链接库,由此试验了一下从0开始接入 Lua 过程记录如下 #Unity 集成 Lua 文档参考Unity 官方文档 Working in Unity -> Advanced Development -> Plug-ins -> NataivePlug-ins 章节 https://docs.unity3d.com/Manual/NativePlugins.html [file:///D:/UnityDocumentation_2019/en/Manual/PluginsForDesktop.html](file:///D:/UnityDocumentation_2019/en/Manual/PluginsForDesktop.html) 参考示例 https://github.com/Unity-Technologies

OpenCV学习记录——1.学习Android NDK

你。 提交于 2020-01-20 00:39:59
文章目录 1.前言 2.什么是NDK 3.为什么要用NDK 4.NDK编译出来的目标类型 5.NDK下载和NDK项目的创建 6.写个hello JNI可执行文件 6.1 程序编写 6.2 程序运行 7.相关配置文件的详解 8.写个 hello JNI 调用 so 8.1 程序编写 8.2 API讲解 8.3 程序运行 9.写个 hello from C++ 9.1 目录解析 9.1.1 JNILearn\app\libs 放置库文件 9.1.2 JNILearn\app\build 编译过程以及结果 9.1.3 rules.ninja 生成的编译命令 9.1.4 build.ninja 编译脚本 9.1.5 配置native方法 9.1.5.1 CMakeLists.txt 文件中内容,配置生成一个 so 库 9.1.5.2 build.gradle 9.2 流程分析 9.2.1 C++的代码,使用 CMake,编译成了 libnative-lib.so 库 9.2.2 MainActivity.java 加载 so 库 9.2.3 MainActivity.java 关联 so 库中方法 9.3 相关文档 9.4 JNI 执行调用流程 9.5 添加一个新的方法 10.CMake 和 ndk-build 的关系 11.使用 ndk-build 方案 11.1 jni 目录编写

Linux下编写动态链接库

自作多情 提交于 2020-01-18 21:33:46
下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。 //so_test.h: #include <stdio.h> void test_a(); void test_b(); //test_a.c: #include <stdio.h> #include "so_test.h" void test_a() { printf("this is in test_a...\n"); } //test_b.c: #include <stdio.h> #include "so_test.h" void test_b() { printf("this is in test_b...\n"); } 1.将这几个文件编译成一个动态库:libtest.so $ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so 用ar工具将目标文件收集起来放到一个文档件中 $ gcc -rcs $HOME/lib/libtes.a libtest.so 2、动态库的链接 在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为

gcc 使用中常用的参数及命令

陌路散爱 提交于 2020-01-18 21:32:39
1. 执行过程 虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。    命令gcc (1). 首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。 (2). 接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。 (3). 汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。 (4). 当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。 基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以

Linux下.ko, .o, .so, .a, .la文件

拥有回忆 提交于 2020-01-18 21:32:18
Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .ko 是Linux 2.6内核使用的动态连接文件的后缀名,也就是模块文件,用来在Linux系统启动时加载内核模块 .o 是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a 为静态库,是好多个.o合在一起,用于静态连接 .la 为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息。可以用如下命令查看file *.la来查看文件类型 创建.a库文件和.o库文件:   $ gcc -c mylib.c   $ ar -r mylib.a mylib.o 动态链接库*.so的编译与使用 1、动态库的编译 下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件,三个.c文件: so_test.h test_a.c test_b.c test_c.c 我们将这几个文件编译成一个动态库:libtest.so。 代码 so_test.h:#include <stdio.h>#include <stdlib.h>void test_a();void test_b();void test_c();test_a.c:#include \"so_test.h\"void test_a(){ printf(\"this is in test

内核调试工具——strace

a 夏天 提交于 2020-01-16 06:07:33
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0 brk(0) = 0xab1000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) ... brk(0) = 0xab1000 brk(0xad2000) = 0xad2000 fstat(1, {st_mode=S_IFCHR

lib和dll文件的区别和联系

与世无争的帅哥 提交于 2020-01-15 22:29:14
什么是lib文件,lib和dll的关系如何 (2008-04-18 19:44:37) (1)lib是编译时需要的,dll是运行时需要的。 如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了。 在开发和调试阶段,当然最好都有。 (2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。 (3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和

定义指令流

青春壹個敷衍的年華 提交于 2020-01-15 17:07:32
程序嘛,简单的定义以下就是一组指令序列,这个指令序列大多数并不是连续的(从被CPU"吸入"的第一个段指令开始(想象吸面条的样子)),假设我们写一个程序, main( ){ int i = 1; i++; i++; open("a file"); close("a file"); } 没有判断操作产生的指令分支切换、也没有循环(当然,程序很丑),这个程序的指令序列会像一根面条一样丝滑的执行完吗?程序中的代码编译出的指令序列即为被执行的指令流吗? 很明显不是的,它调用了open/close这些系统调用,当然,严格来讲,他们并不是系统调用,而是一些库,一些操作系统调用的库,只不过他们总是代表着执行系统调用,所以这么说也算是有所依据;如果看过<ARMv8指令集下的一次异常>系列的文章就会知道,执行到真实的系统调用后,后续CPU执行的代码就不是我们写的。这与动态库的原理有些相似,动态库的代码也不是我们写的,但那些代码并不能在改变CPU硬件状态后继续执行。 于是,程序的指令序列的界限应该在哪里?很明显不能包含CPU状态改变后执行的指令序列,甚至都不能包含公有动态库的部分。 而指令流就可以被理解为跨越程序、动态库、内核代码的一柄闪闪发光的大刀:在程序出发后,将要被CPU执行的指令序列的集合。 完美表达出目标含义。 来源: CSDN 作者: ytfy339784578 链接

Android中的Prelink技术

帅比萌擦擦* 提交于 2020-01-15 13:13:52
1. 原理简介 (1)Prelink   Prelink即预链接技术是利用事先链接以代替运行时链接的技术,以加快共享库的加载速度,它不仅能加快程序启动时间,还可以减少部分内存开销(它能使KDE的启动时间减少50%)。每次程序执行时,进行的链接动作都是一样的,链接相对来说开销很大,尤其是嵌入式系统。 (2)普通Linux系统的Prelink   Redhat系统中prelink工具(/etc/cron.dialy/prelink)会修改可执行程序,把它与所需库的链接信息加入可执行程序。在程序运行时,使用glibc(glibc > 2.3.1-r2)中的ld-linux.so来进行链接。用此方式,每次更新动态库后,使用它的程序都需要重新prelink,因为新库中的符号信息,地址等很可能与原来不同了。 (3)Android的Prelink   Android源码中有一组map文件,其中定义了需要预连接的动态库,其Prelink信息以及对应的逻辑地址(4G地址空间中位置),在动态库编译时,预处理程序apriori根据map文件中的定义,生成预链接信息重定向信息,并加入到这些二进制文件lib*.so的末尾。它主要节约了查询函数地址等工作所用的时间,动态库重定位的开销。在运行程序,动态库加载时,加载程序linker判断动态库是否为Prelink的,如果是的话

ROS节点

对着背影说爱祢 提交于 2020-01-15 07:31:24
ROS节点介绍 在ROS的世界里,最小的进程单元就是节点(node) 一个软件包里可以有多个可执行文件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点 从程序角度来说,node就是一个可执行文件(通常为C++编译生成的可执行文件、Python脚本)被执行,加载到了内存之中 从功能角度来说,通常一个node负责者机器人的某一个单独的功能。由于机器人的功能模块非常复杂,我们往往不会把所有功能都集中到一个node上,而会采用分布式的方式,把鸡蛋放到不同的篮子里 例如有一个node来控制底盘轮子的运动,有一个node驱动摄像头获取图像,有一个node驱动激光雷达,有一个node根据传感器信息进行路径规划,这样做可以降低程序发生崩溃的可能性,试想一下如果把所有功能都写到一个程序中,模块间的通信、异常处理将会很麻烦。 主节点 由于机器人的元器件很多,功能庞大,因此实际运行时往往会运行众多的node,负责感知世界、控制运动、决策和计算等功能。 那么如何合理的进行调配、管理这些node?这就要利用ROS提供给我们的 节点管master ,master在整个网络通信架构里相当于管理中心,管理着各个node node首先master处进行注册,之后master会将该node纳入整个ROS程序中 node之间的通信也是先由master进行“牵线”