Android.mk 忽略链接错误

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

一句话就可以搞定,但是在运行中可能会出现错误,因为库文件找不到依赖的文件就会报错。

有关linux下的依赖库知识解释

linux 编译动态链接库 so,避免运行时才发现函数未定义符号的错误(undefined symbol) ld的参数

ldd  查看 elf文件依赖的  so 动态链接库   可以  export LD_LIBRARY_PATH=/path 设置 so文件的路径,

nm   -u    *.so  或者 nm  |grep  U 查看  那些在  动态链接库中的符号。

"U" The symbol is undefinedundefined的 symbol  这种就是表示 在其他 so动态链接库里面定义的。但是如果你的编译的 是so文件,如果符号不在外部任何so文件里面,默认的配置也不会提示错误。而是编译通过。那个自己忘了定义的符号也在 这  undefined  symbol里面,但是运行时就加载不成功了。

文档说,这种编译so动态链接库时找不到符号(不在任何外部so文件里面,自己的程序也没有定义)也允许编译通过是有原因的,参见 ld 的man 说明   --allow-shlib-undefined 解释(好像英文版的才完整,中文的man ld不完整 可以直接查看网页 https://sourceware.org/binutils/docs-2.24/ld/Options.html#Options )。就是让你链接时用的一个版本的so,运行时加载用的另外一个版本的so,可能你的加载时的so里面有这个符号,所以就先让你找不到符号也编译通过了。如果是编译exe,这中链接时找不到定义的符号的就直接给你报错了。
so动态链接库就不会报错。其实这种特性应该是比较少用,最好在so链接是碰到这个未找到的符号也是报错的好。

所以我觉得编译的动态链接库的时候最好加上 --unresolved-symbols=ignore-in-shared-libs  或者  --no-undefined 来检查一下。这样如果是自己的疏忽在 .c 源文件里面忘记的 某函数的定义,,编译的时候就可以提示错误了。

这里有3个参数可以使用--undefined symbols 和 --no-allow-shlib-undefined 参数的作用范围不一样而已,--undefined symbols 针对常规object文件,--no-allow-shlib-undefined针对的是符号在外部的未定义的shared object里面。--unresolved-symbols和--undefined symbols 作用差不多,不过更具体一些。

我们的目的主要是编译一个so动态链接库时,把自己object里面未定义的符号report出来就可以了,用--no-undefined和--unresolved-symbols=ignore-in-shared-libs应该可以的。

ld   的参数,  如果直接用gcc 编译,可以用   -Wl,--no-undefined 这样传过去

gcc -shared -Wl,-soname,libb.so.1,--no-undefined -o libb.so.1.2    objectfile

gcc -shared -Wl,-soname,libb.so.1,--unresolved-symbols=ignore-in-shared-libs  -o libb.so.1.2   objectfile

时间: 2024-10-12 04:36:00

Android.mk 忽略链接错误的相关文章

android.mk android源码编译

http://www.cnblogs.com/chenbin7/archive/2013/01/05/2846863.html Android.mk简单分析 2013-01-05 22:51 by ...平..淡..., 884 阅读, 0 评论, 收藏, 编辑 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-fil

NDK配置文件Android.mk简介

简介 android.mk主要描述了c或者c++文件时如何在ndk工程中被使用的,该小节主要描述了android.mk的构建规则 概览 android.mk文件描述了你的源码是如何构建的,主要包括:该文件实际上是一个简化了的GNU makefile文件.该文件被构建系统解析一次或多次,因此你需要尽可能少得自定义变量.同样的,也不能在解析过程中认为未定义任何变量 该文件语法决定了如何把你的源码组织到"模块"中,"模块"的概念是: 静态库 动态库 可执行文件 编译器仅仅

Android Jni Android.mk经常使用语句

仅仅要涉及JNI开发都涉及到Android.mk编写,它也是一种makefile语言. 以上一篇博客中提供的project为例! <1> : 信息打印 : 既然是一种简易语言那么首先应该知道可以打印脚本信息的语法部分:一个是基本信息类型,一个是警告,错误类型 $(info TEXT......) 这个函数运行的时候,会输出: TEXT... ... $(error TEXT......) 这个函数被运行的时候,会输出:TEXT......,而且终止make的运行. $(warning TEXT

Android.mk官方说明 中文翻译

转载请注明出处:http://blog.csdn.net/qq_15650553/article/details/51548025 译者注:第一次做这样的翻译,自己感觉还是很多不足,有些概念没有很好的理解,所以翻译过来的中文可能也会有问题.这篇文章主要是用来记录自己的学习所得.所以网友们若要根据下面的译文来学习,不是不行,但是请谨慎. 这篇文章描述了Android.mk文件的语法,这个文件将Android NDK与你的c/c++代码联系到一起. Overview 这个Android.mk文件存在

基于Android2.3.5系统:Android.mk文件解析

*************************************************************************************************************************** 作者:EasyWave                                                                                                               时间:2

Android JNI学习笔记(三)-编译文件Android.mk、Application.mk 与camke

1. 前言 在android2.2中,加入了cmake编译,而以前都是用Android.mk.Application.mk的,今天就来记录下,他们的配置选项. 2. Android.mk Android.mk在jni目录下,用于描述构建系统的源文件以及 shared libraries .文件格式如下: 以LOCAL_PATH变量开始 LOCAL_PATH := $(call my-dir) 紧接着是CLEAR_VARS变量 include $(CLEAR_VARS) 接下来LOCAL_MODU

Android.mk简介

转载:http://blog.csdn.net/sanchuyayun/article/details/8242901 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而Android.mk中所有的变量都是全局的.因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义. 一个Android.mk文件可以编译多个模块,每个模块属下列类型之一: 1)APK程序 一般的An

Android.mk文件语法规范及使用模板

Android.mk文件语法规范 根据eoeandroid上的的连载,进行一些更新.修改和加亮. 今天翻译ANDROID-MK.TXT文件(英文原文件在/development/Ndk/Docs/android-mk.txt) Android.mk文件语法规范 Introduction: Android.mk编译文件是用来向Android NDK描述你的C,C++源代码文件的, 这篇文档描述了它的语法.在阅读下面的内容之前,假定你已经阅读了docs/OVERVIEW.TXT文件,了解了它们的脚色

android.mk知识点笔记(转)

Android.mk详解 想请教下Android.mk中一些属性.方法.定义,总之就想详细了解下Android.mk文件, 我先抛砖引玉. LOCAL_PATH 必须位于Android.mk文件的最开始.它是用来定位源文件的位置,$(call my-dir)的作用就是返回当前目录的路径. Android.mk 定义 属性 方法 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而