从rtspplayer demo程序在手机上运行来看gcc的-rpath, -rpath-link这两个option
2011-03-26 10:19
429 查看
rtspplayer这个程序在手机上运行的时候,要使用fbsink来作为video sink组件。这是使用了framebuffer的一个video sink组件。所以在代码中,很自然只需要在gst_element_factory_make的时候将xvimagesink换成fbsink就可以 了。但是程序在scratchbox中编译了之后,传到了手机上,运行却发生错误,报告说:
No such element ...... `fbsink'
奇怪的是在手机上使用alp-gst-inspect|grep "fbsink"却能查到这个element。后来才知道,fbsink这个element存在于/opt/alp/lib /libalp_media.so文件中。而这个.so文件不在rtspplayer运行期动态链接库的查找范围之内,所以,fbsink创建就失败了。
如何让libalp_media.so这个文件存在于rtspplayer运行期的动态链接库的查找范围内呢?很简单,在编译的时候,加上 -L/opt/alp/lib -lalp_media即可。也就是说,虽然代码没有显式的调用这个.so中的函数,但是我们在编译的时候手动将这个.so作为一种dependency 链接上,这样就OK了。但是,加上这样的内容后,编译发生错误:
gcc -Wall -g -o rtspplayer `pkg-config --cflags --libs gtk+-2.0` -I/usr/include/gstreamer-0.10 -L/opt/alp/lib -lGSTfusion -lalp_media main.c gstplay.c gstplay-marshal.c
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_audiomgr.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_gstaudiomgrsrc.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_gstaudiomgrsink.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_core.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_sysutils.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_drm1.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_fclose'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_get_message_ID'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_open'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_unpack_start'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_log'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_close'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_is_drm_file'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_init'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_fseek'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_fopen_with_permission'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_get'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_connection_register_disconnect_callback'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_unpack_end'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_channel_connect'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_connection_register_receive_callback'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_check_rights_info'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_unpack_int32'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_ftell'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_value_clean'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_unpack_string'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_fread'
collect2: ld returned 1 exit status
make: *** [rtspplayer] Error 1
这个错误报告说找不到libalp_gstaudiomgrsrc.so等一堆so文件,这些so文件都位于/opt/alp/lib目录下,他们是libalp_media.so所需要的。换句话说,在libalp_media.so中还存在需要的动态链接库。
在这种情况下,-rpath, -rpath-link这两个选项应运而生了。其实我们费这么大劲,无非就是要把libalp_media.so这个加入到rtspplayer的动态链 接库查找列表中去,形象一点来说,就是使用命令ldd ./rtspplayer的时候,能看到libalp_media.so这一行。
-rpath/-rpath-link其实都是ld的option,不是gcc的。gcc只是一个wrapper,将preprocessor, assemble, link三者结合了起来。-rpath <dir>的作用是手动将一个目录强行指定成一个.so文件的搜索目录,他的优先级在LD_LIBRARY_PATH和/etc /ld.so.conf...这些地方定义的.so文件搜索目录之上。由于这个目录是由程序的开发人员在编译的时候指定的,所以将来这个程序到了其他机器 上运行的时候,这个目录是不能修改的。
-rpath-link和-rpath类似,只不过-rpath-link <dir>指定的是该程序需要的某个动态链接库,如果还需要其他的动态链接库(就象我们这里libalp_media.so还需要其他 的.so一样)的时候,到哪个/哪些目录下去查找需要的.so。而且,和-rpath不同,在-rpath-link中定义的目录,有可能在ldd <exec>的输出中看不见,因为这里定义的目录不是该执行程序本身所需要的。
清楚了这两个option的含义之后,来看用法,要在gcc的命令行中直接使用这两个option,必须遵循语法:-Wl,......。比 如:-Wl,--rpath-link /opt/alp/lib。-Wl就是告诉gcc,后面的内容是传递给linker的option。如果直接使用ld的话,就不需要-Wl,了。所以,上 面我们的编译命令就变成这样,就OK了:
gcc -Wall -g -o rtspplayer -Wl,--rpath-link /opt/alp/lib `pkg-config --cflags --libs gtk+-2.0` -I/usr/include/gstreamer-0.10 -L/opt/alp/lib -lGSTfusion -lalp_media main.c gstplay.c gstplay-marshal.c
这样,再次将生成的rtspplayer拷贝到手机中就可以运行了,不会再说找不到fbsink element了。
这里是gcc命令行中给assembler, preprocessor, linker传递option的具体关键字列表:
Code: Select all
此外,定义LD_LIBRARY_PATH也是可以的。这样就不用加-Wl,--rpath-link /opt/alp/lib这个内容了。具体的ld是如何查找动态链接库的逻辑,请看man ld中有关-rpath, -rpath-link这两部分的详细解释。
No such element ...... `fbsink'
奇怪的是在手机上使用alp-gst-inspect|grep "fbsink"却能查到这个element。后来才知道,fbsink这个element存在于/opt/alp/lib /libalp_media.so文件中。而这个.so文件不在rtspplayer运行期动态链接库的查找范围之内,所以,fbsink创建就失败了。
如何让libalp_media.so这个文件存在于rtspplayer运行期的动态链接库的查找范围内呢?很简单,在编译的时候,加上 -L/opt/alp/lib -lalp_media即可。也就是说,虽然代码没有显式的调用这个.so中的函数,但是我们在编译的时候手动将这个.so作为一种dependency 链接上,这样就OK了。但是,加上这样的内容后,编译发生错误:
gcc -Wall -g -o rtspplayer `pkg-config --cflags --libs gtk+-2.0` -I/usr/include/gstreamer-0.10 -L/opt/alp/lib -lGSTfusion -lalp_media main.c gstplay.c gstplay-marshal.c
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_audiomgr.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_gstaudiomgrsrc.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_gstaudiomgrsink.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_core.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_sysutils.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/scratchbox/compilers/arm-linux-gnueabi/bin/../lib/gcc/arm-none-linux-gnueabi/4.1.2/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libalp_drm1.so, needed by /opt/alp/lib/libalp_media.so, not found (try using -rpath or -rpath-link)
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_fclose'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_get_message_ID'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_open'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_unpack_start'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_log'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_close'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_is_drm_file'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_init'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_fseek'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_fopen_with_permission'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_get'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_connection_register_disconnect_callback'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_unpack_end'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_channel_connect'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_connection_register_receive_callback'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_check_rights_info'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_unpack_int32'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_ftell'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_settings_value_clean'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_ipc_message_unpack_string'
/opt/alp/lib/libalp_media.so: undefined reference to `alp_drm_fread'
collect2: ld returned 1 exit status
make: *** [rtspplayer] Error 1
这个错误报告说找不到libalp_gstaudiomgrsrc.so等一堆so文件,这些so文件都位于/opt/alp/lib目录下,他们是libalp_media.so所需要的。换句话说,在libalp_media.so中还存在需要的动态链接库。
在这种情况下,-rpath, -rpath-link这两个选项应运而生了。其实我们费这么大劲,无非就是要把libalp_media.so这个加入到rtspplayer的动态链 接库查找列表中去,形象一点来说,就是使用命令ldd ./rtspplayer的时候,能看到libalp_media.so这一行。
-rpath/-rpath-link其实都是ld的option,不是gcc的。gcc只是一个wrapper,将preprocessor, assemble, link三者结合了起来。-rpath <dir>的作用是手动将一个目录强行指定成一个.so文件的搜索目录,他的优先级在LD_LIBRARY_PATH和/etc /ld.so.conf...这些地方定义的.so文件搜索目录之上。由于这个目录是由程序的开发人员在编译的时候指定的,所以将来这个程序到了其他机器 上运行的时候,这个目录是不能修改的。
-rpath-link和-rpath类似,只不过-rpath-link <dir>指定的是该程序需要的某个动态链接库,如果还需要其他的动态链接库(就象我们这里libalp_media.so还需要其他 的.so一样)的时候,到哪个/哪些目录下去查找需要的.so。而且,和-rpath不同,在-rpath-link中定义的目录,有可能在ldd <exec>的输出中看不见,因为这里定义的目录不是该执行程序本身所需要的。
清楚了这两个option的含义之后,来看用法,要在gcc的命令行中直接使用这两个option,必须遵循语法:-Wl,......。比 如:-Wl,--rpath-link /opt/alp/lib。-Wl就是告诉gcc,后面的内容是传递给linker的option。如果直接使用ld的话,就不需要-Wl,了。所以,上 面我们的编译命令就变成这样,就OK了:
gcc -Wall -g -o rtspplayer -Wl,--rpath-link /opt/alp/lib `pkg-config --cflags --libs gtk+-2.0` -I/usr/include/gstreamer-0.10 -L/opt/alp/lib -lGSTfusion -lalp_media main.c gstplay.c gstplay-marshal.c
这样,再次将生成的rtspplayer拷贝到手机中就可以运行了,不会再说找不到fbsink element了。
这里是gcc命令行中给assembler, preprocessor, linker传递option的具体关键字列表:
Code: Select all
-Wa,<options> Pass comma-separated <options> on to the assembler -Wp,<options> Pass comma-separated <options> on to the preprocessor -Wl,<options> Pass comma-separated <options> on to the linker
此外,定义LD_LIBRARY_PATH也是可以的。这样就不用加-Wl,--rpath-link /opt/alp/lib这个内容了。具体的ld是如何查找动态链接库的逻辑,请看man ld中有关-rpath, -rpath-link这两部分的详细解释。
相关文章推荐
- Android 运行 C/C++程序 (使用 arm-linux-gcc 交叉编译环境)
- 突然想到一问题想请教各位. .NET编的手机程序能在一般的手机上运行吗?
- HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo
- Android开发19——将Android程序部署至真实Android手机以及asm.jar的运行
- 用命名内核对象防止windows同时运行两个程序
- ECLIPSE开发ANDROID程序如何在手机上运行
- 让Qt程序在运行到Nokia手机上
- Eclipse开发Android程序如何在手机上运行
- GCC链接选项-L,-rpath-link和-rpath
- 如何用codeblocks同时运行一个工程里的两个程序
- vs2010程序运行出错 link : fatal error lnk1123: 转换到 coff 期间失败: 文件无效或损坏
- Android for Java - Eclipse开发Android程序如何在手机上运行
- eclipse无法运行android程序往往是因为断口被手机管家之类的软件占用的原因
- 限制程序只运行一次,再隐藏后重新唤出的方法。两个开发环境下实现
- 用VBS调用程序并对程序的运行情况进行监控的两个代码
- eclipse下添加GCC编译器的编译链接库以及程序运行参数方法
- android studio运行安装后,手机上出现两个相同的App图标
- GCC 编译依赖库和程序运行依赖库设置
- 终于,我生命中第一次编译并运行了手机程序
- Eclipse环境下为同一个程序配置两个运行环境