****************************************************************************************************
实验目的1:
android: 运行文件连接静态库1, 静态库1依赖于静态库11, 运行文件和静态库11有什么关系
简言之。爷爷和孙子之间的关系
实验目的2: 会写Android.mk, 会写简单测试程序,了解整个过程。
author: hjjdebug
date: 2012/11/21
****************************************************************************************************
实验结果:
1可以不包含11的静态库文件, 但执行文件需要包含所有静态库文件,否则出现连接错误。把11 编成动态库也是一样。
windows 下做实验也是一样的, 我试过了。
所以得出结论: 静态库只是一个简单的.o 的集合,根本没有连接的过程.
而动态库和运行文件一样,则是把外部调用都连接起来。
实验目的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$