动态库

2010.3.10

喜欢而已 提交于 2020-03-12 06:42:27
学习的内容: 嵌入式linux开发工具-vim、gcc gdb make vim 文本编译器:学会使用和如何配置vim gcc(编译器):学会制作动态库和静态库及使用与区别 gdb调试器:设置断点 单步执行 调试内存错误 make 工程管理器:编译make file文件 1.文本编译器:vim最强大的文本编译器—目标—摆脱鼠标 vi—vim—gvim:命令行模式(nyy/p/dd/u) 插入模式(i,a) 底行模式(shift+:) 2.如何配置vim?etc/vim/vimrc IDE(集成开发程序) 编译器:gcc(GNU/cc) 3.gcc特点(GNU工具、一款交叉编译器arm-linux-gcc) 4.什么是交叉编译器? 在内核源码在目标机执行的 5.为什么需要交叉编译器? 处理器不一样 6.源文件到可执行文件需要经历哪几步? 预处理、编译 汇编 链接 hello.c gcc hello.c a.out.—>Luniux手机(ARM) 7.交叉编译:在当前CPU平台下编译除在其他cpu平台下可执行代码 8.系统移植: 9. 预处理:头文件展开,宏替换 ,条件编译 编译 将预处理文件编译成汇编文件,.s 汇编 将汇编文件编译生成目标文件.o 链接 建立符号表–可执行文件a.out 10.<>系统的头文件目录(usr/include)找不到会报错 ""搜索路径是在当前目录查找

Android Studio 编写 JNI

情到浓时终转凉″ 提交于 2020-03-07 22:46:15
之前一直都不知怎么编写JNI,今天刚好学习一下,感谢梦真的指教,以及提供的文档。 参考链接    http://blog.csdn.net/u011168565/article/details/51878176    http://www.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html 创建一个jni类(.java文件)   1. 创建Android studio 工程   2. 切换到project视图   3. 创建jni类如下所示 package com.example.tony.jnidemo; /** * Created by Tony on 2016/7/19. */ public class JNITest { public native String getJNIString(); // jni接口函数 static { System.loadLibrary("hello-jni"); //加载jni动态库,只写库名,库名称是在build.gradle中指定的。 } } 生成.class文件   点击导航栏build-> Make Module "app", 编译jni类(.java文件),生成.class文件   生成的.class文件在app/build/intermediates

“libgomp.so.1: version `GOMP_4.0\' not found” || “libstdc++.so.6: version `CXXABI_1.3.8\' not found”错误

女生的网名这么多〃 提交于 2020-03-07 22:03:54
类似问题还有 'ImportError ../lib/libstdc++.so.6: version `CXXABI_1.3.7' not found (required by xxx)'、 'ImportError ../lib/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by xxx)'等。 这种报错情况一般出现在Anaconda环境的Python程序中,原因是Anaconda对应目录下的“ libgomp.so.1 ”和“ libstdc++.so.6”动态库文件(lib)中相关模块的版本比较旧,不包含相应版本模块导致的 。 系统中动态库存放路径在 : /usr/lib/x86_64-linux-gnu/ 或 /usr/lib/ anaconda中动态库存放路径是 : ~/anaconda2/lib 查看Linux系统动态库文件包含的 模块版本: strings /usr/lib/libstdc++.so.6 | grep 'CXXABI' 或者 strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep 'CXXABI' 输出: CXXABI_1.3 CXXABI_1.3.1 CXXABI_1.3.2 CXXABI_1.3.3 CXXABI_1.3

基础IO(文件操作)

一曲冷凌霜 提交于 2020-03-07 02:26:59
文章目录 文件操作 系统调用的文件操作 文件描述符 文件流指针与文件描述符的关系 重定向 动态库和静态库 文件操作 FILE * fopen ( const char * path , const char * mode ) ; FILE:返回值是文件流指针类型 path:需要打开文件的路径,可以是绝对路径,也可以是相对路径(相对与当前目录的路径) mode: r: 以读方式打开,如果当前文件不存在,则会报错 r+: 以读写方式打开,如果当前打开文件不存在,则报错 w: 以写方式打开,如果文件不存在,则在当前目录下创建该文件;如果当前文件存在,则将当前文件截断(清空) w+: 以读写方式打开,其他和w形式相同 a: 以追加方式打开(文件流指针指向当前文件的尾部,不能读),如果文件不存在则创建 a+: 以追加方式打开,如果文件不存在则创建,支持可读可写 size_t fread ( void * ptr , size_t size , size_t nmemb , FILE * stream ) ; ptr: 将fread读到的内容保存在ptr下 size: 块的大小 nmemb: 需要读的块的个数 size* nmemb == 总的字节数量 stream: 文件流指针,从哪里读 返回值: 返回成功读取到的块的个数 用法: 将块的大小指定为1(1个字节)

关于“Failed to complete setup of assembly(hr = 0x80131040). Probing terminated”

那年仲夏 提交于 2020-03-06 18:23:09
场景:动态库UFileDev(运行时版本v4.0.30319)内置方法调用了动态库ICSharpCode.SharpZipLib(运行时版本v2.0.50727)。调用动态库UFileDev过程中一直报错如下: === Pre-bind state information === LOG: DisplayName = ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73 (Fully-specified) LOG: Appbase = file:///G:/program_test/WebApiTest/ LOG: Initial PrivatePath = G:\program_test\WebApiTest\bin Calling assembly : UFileDev, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7bcd44e2dce6fe6. === LOG: This bind starts in default load context. LOG: Using application configuration file: G:\program_test\WebApiTest

Linux 相关编译知识

瘦欲@ 提交于 2020-03-05 04:46:00
  一直对编译的过程概念很模糊,总结记录一下方便以后复习。   Linux下gcc编译器使用:   gcc编译流程: 1、预处理        gcc -E hello.c -o hello.i        对包含的头文件和宏定义进行处理 2、编译         gcc -s hello.i -o hello.s        检查代码的规范性,是否有语法错误,把代码翻译成汇编语言 3、汇编         gcc -c hello.s -o hello.o        汇编语言转成二进制目标代码 4、链接         gcc hello.o -o hello                 上述流程中的第四步链接阶段,涉及到一个概念:函数库   函数库分为静态库和动态库两种。静态库是指编译链接时,将库文件的代码全部加入可执行文件中,因此生成的文件较大,但是在运行时不再需要库文件, 其后缀名为“.a”。动态库是在程序执行的时候加载库,这样可以节省开销,后缀名为".so"。   静态库: 静态库的生成及使用: 1、生成.o文件      gcc -c hello.c 2、制作静态库      ar rcsv libhello.a hello.o              ar:归档工具,将hello.o归档成静态库 3、链接静态库      gcc -o hello

Linux 下文件编译

為{幸葍}努か 提交于 2020-03-05 04:41:06
以前一直不理解Linux 下编译产生的各种文件是什么意思,今天花了一点时间来理一理: 首先介绍静态链接库(lib)和动态链接库(dll)的区别: 静态链接库就是把(lib)文件中用到的函数直接连接到目标代码中,程序运行时不需要改静态库;动态库在编译时不会被连接到目标代码中,在程序运行时会动态的调用这个dll库 1、以下面的源程序为例--hello.c、hello.h和main.c: 程序1: hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name); #endif //HELLO_H 程序2:hello.c #include <stdio.h> void hello(const char *name) { printf("Hello %s!\n", name); } 程序3:main.c #include "hello.h" int main() { hello("everyone"); return 0; } 2、将hello.c编译成.o文件 无论静态库,还是动态库,都是由.o文件创建的 gcc -c hello.c 会生成hello.o目标文件 3、由.o文件创建静态库 静态库文件名是以lib为前缀,扩展为,a.创建静态库时用ar命令 ar -cv libhello.a hello.o 4

通过trace跟踪系统调用

╄→гoц情女王★ 提交于 2020-03-04 15:16:53
简介 strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0brk(0) = 0xab1000access("/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) = 0x7f29379a7000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)...brk(0) = 0xab1000brk(0xad2000) = 0xad2000fstat(1, {st_mode=S_IFCHR|0620, st

Linux strace追踪命令详解

穿精又带淫゛_ 提交于 2020-03-04 15:16:25
strace介绍 strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。当然strace与专业的调试工具比如说gdb之类的是没法相比的,因为它不是一个专业的调试器。 strace的最简单的用法就是执行一个指定的命令,在指定的命令结束之后它也就退出了。在命令执行的过程中,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

[strace]跟踪进程的系统调用

你。 提交于 2020-03-04 15:15:02
转自 : https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号,调试应用程序的时候经常使用 。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 输出参数含义 root@ubuntu:/usr# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0brk(0) = 0xab1000access("/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) = 0x7f29379a7000access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or