运行文件,静态库,动态库之间关系

****************************************************************************************************
实验目的1:
android: 运行文件连接静态库1, 静态库1依赖于静态库11, 运行文件和静态库11有什么关系
简言之。爷爷和孙子之间的关系
实验目的2: 会写Android.mk, 会写简单测试程序,了解整个过程。
author: hjjdebug
date: 2012/11/21
****************************************************************************************************
实验结果:
1可以不包含11的静态库文件, 但执行文件需要包含所有静态库文件,否则出现连接错误。把11 编成动态库也是一样。
windows 下做实验也是一样的, 我试过了。

所以得出结论: 静态库只是一个简单的.o 的集合,根本没有连接的过程.
               而动态库和运行文件一样,则是把外部调用都连接起来。

延伸结论: 当你想把两个.a 文件连接成一个大的.a 文件时, 办法是把两个.a 都拆成.o, 再把所有.o 打包成.a

****************************************************************************************************
实验过程:文件目录
****************************************************************************************************
hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$ ls
Android.mk  log.h  test11.cpp  test1.cpp  test.cpp
################################################################################
# Android.mk 文件
################################################################################
hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$ cat Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
        test11.cpp \

LOCAL_MODULE:= libtest11
include $(BUILD_STATIC_LIBRARY)
########################################
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
        test1.cpp \

LOCAL_MODULE:= libtest1
LOCAL_MODULE_TAGS:= optional   #不加该句,编译为共享库或运行文件时会有警告


include $(BUILD_STATIC_LIBRARY)
#include $(BUILD_SHARED_LIBRARY)
########################################
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
        test.cpp \

LOCAL_STATIC_LIBRARIES := libtest1 libtest11 #关键字不能写错
LOCAL_SHARED_LIBRARIES := libcutils


LOCAL_MODULE:= test
LOCAL_MODULE_TAGS:= optional   #不加该句,编译为共享库或运行文件时会有警告
include $(BUILD_EXECUTABLE)
hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$


// 测试源文件, 我采用了 C 导出函数格式

hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$ cat test.cpp
extern "C"
{
        int test1();
}
int main(int argc, char *argv[])
{
        test1();
        return 0;
}
hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$ cat test1
test11.cpp  test1.cpp   
hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$ cat test1.cpp
#include "log.h"
extern "C"
{
        int test1();
        int test11();
}
int test1()
{
        logwrite("this is test1");
        test11();
        return 0;
}
hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$ cat test11.cpp
#include "log.h"
extern "C"
{
        int test11();
}
int test11()
{
        logwrite("this is from test11");
        return 0;
}


// log.h, android 打印log

hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$ cat log.h
#ifndef _MY_ANDROID_LOG_H
#define _MY_ANDROID_LOG_H
#include <stdio.h>
#include <stdarg.h>

#include <android/log.h>  
#define LOG_ERR         ANDROID_LOG_ERROR
#define LOG_WARN        ANDROID_LOG_WARN
#define LOG_INFO        ANDROID_LOG_INFO
#define LOG_TRACE       ANDROID_LOG_VERBOSE

#ifdef __cplusplus
extern "C"
{
#endif
#define LOG_TAG "test"
#define LOG_LEVEL LOG_TRACE
        inline void logwrite(const char *format, ... )
        {
                va_list ap;
                char buf[1024]={0};    
                va_start(ap, format);
                vsnprintf(buf, 1024, format, ap);
                va_end(ap);
                __android_log_write(LOG_LEVEL, LOG_TAG, buf);
        }

#ifdef __cplusplus
}
#endif

#endif


// 编译结果

hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$ touch *
hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$ mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.3
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IML74K
============================================
make:进入目录'/home/hjj/code/android4.0.3'
target thumb C++: libtest11 <= external/adtv2/services/test/test11.cpp
target StaticLib: libtest11 (out/target/product/generic/obj/STATIC_LIBRARIES/libtest11_intermediates/libtest11.a)
target thumb C++: libtest1 <= external/adtv2/services/test/test1.cpp
target StaticLib: libtest1 (out/target/product/generic/obj/STATIC_LIBRARIES/libtest1_intermediates/libtest1.a)
target thumb C++: test <= external/adtv2/services/test/test.cpp
target Executable: test (out/target/product/generic/obj/EXECUTABLES/test_intermediates/LINKED/test)
target Symbolic: test (out/target/product/generic/symbols/system/bin/test)
target Strip: test (out/target/product/generic/obj/EXECUTABLES/test_intermediates/test)
Install: out/target/product/generic/system/bin/test
make:离开目录“/home/hjj/code/android4.0.3”
hjj@hjj-ubuntu:~/code/android4.0.3/external/adtv2/services/test$




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值