- 浏览: 517418 次
- 性别:
- 来自: 广州
最新评论
-
lin_kk:
最近正在学,请问LZ有源码事例吗,如果有能发一下我邮箱吗,万分 ...
使用libgdx及其中的box2d 2.1的注意事项 -
ahong520:
编译都通不过
ffmpeg对音频解码的一般步骤 -
辽东小小:
yajun_soft 写道XXX@XXX:~$ adb she ...
adb push的Permission denied -
cdtdx:
好文, 相当不错啊. 收了.
什么是app2sd,app2ext,data2ext?app移动到SD卡哪里去了? /mnt/asec /mnt/secure -
dickycat:
学习了,最近正在学这一块,年纪大了,学起来有点吃亏!
使用libgdx及其中的box2d 2.1的注意事项
文章列表
Linux Shell编程入门
- 博客分类:
- Linux
转:http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程, ...
转:http://www.lingcc.com/2012/05/31/12093/#sec-1
“undefined reference to XXX”是一类挺常见的链接错误,原因通常是链接时找不到声明成extern类型的函数的定义点。不过这次遇到的undefined reference中的XXX函数明明在一个库中定义,而且该库明明已经在命令行用-l指定了,ld –verbose也显示能找到该库文件。
Table of Contents
1 快速解决方案
尝试在Android下编译纯C的静态程序,执行gcc -v -static -o sayhi sayhi.c后有3条重要的命令
ccl -quiet -v -iprefix /home/carmenloklok/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/bin/../lib/gcc/arm-linux-androideabi/4.4.3/ sayhi.c -mbionic -fpic -quiet -dumpbase sayhi.c -mar ...
这个问题烦了我一天了..郁闷.本人想试验一下使用ndk里面的toolchains直接编译一个纯C的程序,使其在Android下可运行.于是在Ubuntu下写了一个简单的程序:
sayhi.c
void main(){
write(1,"hi\n",3);
}
首先设置export PATH=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/bin:$NDK/toolchains/arm-linuxandroideabi-4.4.3 ...
在我们开发的一个系统中,由于动态链接其中的一个动态库时,编译时没有问题,而运行时不能进行,如果将该库静态连接时,运行却没有问题。具体什么原因,一直没有搞清楚,权且当作暂时的解决办法。
如何同时同时使用动态和静态库链接,在GCC指令参数中具体参数如下:
-Wl,-Bstatic -L/usr/local/sqlite-arm-linux/.libs -lsqlite -Wl,-Bdynamic -L/usr/local/arm/3.3.2/lib
具体用途解释:sqlite库静态连接,其它库动态连接。
-Wl,-Bstatic 与-Wl,-Bdynamic参数, ...
gcc -L 与-Wl,rpath区别
- 博客分类:
- Linux
链接时查找的位置和运行时查找的位置是两码事
-L指定编译链接时的搜索目录
-Wl,-rpath指定程序运行时加载的共享库搜索目录
ffmpeg编译出来的库组成及其作用
- 博客分类:
- FFMpeg
当我们把FFmpeg(0.11.1)项目完整编译出来后,会有7个库文件,根据so依赖关系排行.
1.libavdevice
2.libavfilter
3.libavformat 容器,也就是文件的格式,装载着流
4.libavcodec 编码,解码器,针对某一流
5.libswscale
6.libswresample
7.libavutil 一般工具类,以上的组件都要依赖它
音视频编解码都在libavcodec目录,文件合成分离都在libavformat目录。./libavcodec/flvdec.c是FLV视频解码器./libavformat/flvdec.c就是FL ...
多个静态库如何生成一个动态库?
- 博客分类:
- Linux
目前有2种做法:
第一种:直接在gcc 2个参数直接放置静态库
$(CC) -shared -fPIC -Wl,--whole-archive $(OBJECTS) -Wl,--no-whole-archive -Wl,-soname -o $@
第二种:把全部静态库解出来,再使用gcc编译
gcc编译四个阶段步骤
- 博客分类:
- Linux
#gcc hello.c
该命令将hello.c直接生成最终二进制可执行程序a.out
这条命令隐含执行了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的二进制可执行程序。这里未指定输出文件,默认输出为a.out。
从上面我们知道GCC编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤。
GCC编译C源码有四个步骤:
预处理-----> 编译 ----> 汇编 ----> 链接
现在我们就用GCC的命令选项来逐个剖析GCC过程。
android开发用ndk编译so库时,有时直接从别的地方拷贝Android.mk文件,会报:
make: *** 没有规则可以创建“obj/local/armeabi/objs/a/a.o”需要的目标“/a.c”。 停止。
出现这个这个错误,可能是因为android.mk的文件格式可能是windows下拷贝,或是从网页copy,只要用vi在linux下打开Android.mk文件把行尾一些多余的看不见字符清除即可,或者重新打过Android.mk
libdl.so的用途
- 博客分类:
- Linux
通过对某些bin或者so执行ldd.可以看到他们运行前需要连接的共享库.但是有时候会看到有2个与dl相关的so.
ld-linux.so和libdl.so.这时候我就有些困惑了.他们分别做了什么工作呢?
原来,ld-linux.so的工作是在程序运行前把程序需要的so找到并进行连接.然后程序才开始运行.
然而,在linux中是支持在程序运行时才进行so库的连接的,函数包括dlopen,dlclose,dlsym,dlerror.这几个函数的实现库就是libdl.so,所以libdl.so的工作是在程序运行时找到指定的so并连接.
gcc编译时指定库的全称
- 博客分类:
- Linux
在使用gcc编译时,当需要指定库,需要用到 -L 和 -l 这2个参数.
-L是指定要搜索的目录,如果有多个目录,可以有多个-L参数.
-l是指定要连接的库名,例如:-lhi,则会去连接libhi.so.但是如果我们的文件名是libhi.so.1呢?这时候会提示找不到.
这时候我们就不要使用-l了.而是直接输入该文件名.把-lhi改为libhi.so.1就可以了.
在生成共享库的时候,我们可以指定它的soname.通过 -Wl,-soname=libxxx.so.x 设置该共享库的soname.如果我们没有设置它的soname,则默认为该共享库的文件名.
在成功编译一个程序后,相应库的soname已经写在该程序里,在程序运行前会根据这些soname去搜索文件名和soname相等的库,进行连接并运行.
/lib/ld-linux.so.2是ELF格式可执行程序的动态链接程序,用于装配应用程序所需的共享库.在运行应用程序时,内核先要启动/lib/ld-linux.so.2,ld-linux.so.2将应用程序与共享库连接好,再启动实际的应用程序.
绕过 libc 直接使用系统调用
- 博客分类:
- Linux
http://blog.openrays.org/blog.php?do=showone&tid=422
系统调用是用户态进程切入内核态的唯一入口,是内核为用户态进程提供服务的接口。Linux Kernel 提供了大约300个左右的系统调用,作为用户空间进程访问内核的 API。C 语言环境下,经常使用的系统调用(如getpid)是系统基础库 libc 封装过的,也就是系统调用的实现库是libc,在其后面究竟隐藏着什么样的秘密呢?1. 先看一个例子:#include <stdio.h>