https://github.com/zytc2009/BigTeam_learning
分类: C/C++
2010-12-01 12:54:47
这里分为两种情况来说,
如果你要添加lib
假设这里我们要添加一个libtest.so,按一下步骤进行
1,在opencore目录下,新建一个文件夹test,在test目录下添加build目录,在build目录下分别创建android和 make两个目录,进入make目录,创建一个新文件local.mk。文件的内容按如下模版进行,也可以去其他的位置copy一份过来:
LOCAL_PATH := $(call get_makefile_dir)
include $(MK)/clear.mk
TARGET := test_lib
XINCDIRS +=
SRCDIR := ../../
INCSRCDIR :=
SRCS := test.c
LIBS
include $(MK)/library.mk
2,在build_config/opencore_dynamic/makefile里include $(MK)/cml2_shared.mk之前一行,加上
TARGET_shared += "test"
SOLIBDIRS_test="/test/build/make"
test_so_name='test'
SOLIBS_test=""
然后执行make,即可。
如果要添加一个可执行程序,local.mk的最后一行写成:include $(MK)/prog.mk
直接在build_config/opencore_dynamic/makefile里更改TESTAPPS
TESTAPPS="pvplayer_engine_test test_pvauthorengine pv2way_omx_engine_test xxxx"
然后加上
TESTAPP_DIR_xxxx=
执行make。
# Use XCFLAGS to add extra compiler directives for the C compiler
# if you add any please use "XCFLAGS += ..." not "XCFLAGS = "
# unless you're sure you want to override the project defaults.
# Please include a comment if you do this.
#
# XCFLAGS +=
# Use XCXXFLAGS to add extra compiler directives for the C++ compiler.
# See notes above regarding overriding project defaults.
#
# XCXXFLAGS += -DUSE_UNICODE -D_POSIX_PTHREAD_SEMANTICS #-D_POSIX_SOURCE
XCXXFLAGS += $(FLAG_COMPILE_WARNINGS_AS_ERRORS)
# Use XCPPFLAGS to add extra preprocessor directives. Use XINCDIRS
# for other include directories, but please only do this if absolutely
# necessary -- let the makefile system find the include directories if
# possible.
# See notes above regarding overriding project defaults.
#
# XCPPFLAGS +=
# Use XINCDIRS for extra include directories. These should be proceeded
# with "-I" just as they would be when passing to the compiler.
#
# XINCDIRS +=
# Use XLIBDIRS for extra library directories. These should be proceeded
# with "-L" just as they would be when passing to the linker.
# Used for building executables.
#
# XLIBDIRS +=
# Use XLDFLAGS for extra linker directives.
# Used for building executables.
#
# XLDFLAGS +=
我这里是特指opencore 单独拿出来编译,而不是在android的框架下。
在实际操作的过程中遇到了许多的问题,我想对其中的内容做下扩充。
我所碰到的一个问题就是如何在link的过程中让它找到我们private的lib。
例如用我们平台自己的mp3 decoder,而不用opencore中自带的。
按照文档说法:
# with "-L" just as they would be when passing to the linker.
# Used for building executables.
#
# XLIBDIRS +=
# Use XLDFLAGS for extra linker directives.
# Used for building executables.
#
# XLDFLAGS +=
似乎我改这两个varable就ok了。
但实际上这两个varable只有在编译prog才会起作用。如果你想实现一个so,或改库中已经有的so,是没有用的。
因为:
在linux_arm.mk中提供了生成so的实现方法:
define generate_shared_lib
$(quiet) $(SHARED_LINK)
$(SHARED_PRE_LDFLAGS) $(if $(strip $(SONAME_ARG)),$(SONAME_ARG)$(notdir
$1)) -o $1 $(filter-out $5,$2) $(SHARED_POST_LDFLAGS) $4 $5
$(ANDROID_LDFLAGS) $(SYSLIBS)
$(if $(filter release,$(strip $(DEFAULT_LIBMODE))),$(call strip_binary,$1))
endef
调用它的地方在cml2_parser.mk:
shared: $(DESTDIR)/lib$(1)$(TARGET_NAME_SUFFIX).$(SHARED_LIB_EXT)
lib$(1): $(DESTDIR)/lib$(1)$(TARGET_NAME_SUFFIX).$(SHARED_LIB_EXT)
$(DESTDIR)/lib$(1)$(TARGET_NAME_SUFFIX).$(SHARED_LIB_EXT):
$(foreach lib,$($(1)_CUMULATIVE_TARGET_LIST),$($(lib)_$(1)_fullname))
$(foreach shlib,$(strip $(call remove_quotes,$(MODS_$(1)))),$(patsubst
-l%,$(DESTDIR)/lib%$(TARGET_NAME_SUFFIX).$(SHARED_LIB_EXT),$(shlib)))
$(eval $(1)_fullname:=$(DESTDIR)/lib$1$(TARGET_NAME_SUFFIX).$(SHARED_LIB_EXT))
@echo "[make] Building $$@..."
$$(call create_objdir,$$(@D))
$(eval $(1)_SUPPORTED_LIBS_FULLNAME:=$(foreach shlib,$(call remove_quotes, $(SUPPORTED_LIBS_$1)),$($(shlib)_$(1)_fullname)))
$$(call
generate_shared_lib,$$@,$$^,$(strip
$($(1)$(TARGET_NAME_SUFFIX)_PRELINK)),$($1_LDFLAGS),
$($(1)_SUPPORTED_LIBS_FULLNAME))
@echo "[make] DONE building $$@."
而library.mk 并没有使用以上所声明的varable。
而且这里面的:
$(LIBTARGET): $(COMPILED_OBJS) $($(TARGET)_LIBDEPS)
@echo Build $@
$(call create_objdir,$(@D))
$(call generate_$(LIBTYPE)_lib,$@,$^)
@echo Done
还不知道是干嘛用的,似乎和编译我们的so没半毛钱关系。
费劲力气尝试改变XLIBDIRS, XLDFLAGS ,LIBS,ANDROID_LDFLAGS等等都是徒劳的
我的解决方法是从源头cml2_parser.mk中把命令行的第四个参数$($1_LDFLAGS), 改为$(ANDROID_LDFLAGS)
这样我再local.mk中声明的
ANDROID_LDFLAGS := -ldsp -latgmm -ltrace -L$(BASE_DIR)/augusta/lib
就会被添加到generate_shared_lib 的$4上,也就可以成功编译。
其实说到底遇到麻烦是因为自己对makefile的语法并不是很熟悉,以上的解决方法我自己感觉也不是最好的。只是目前还是可以方便的用。
希望路过的有经验有想法的人发表下自己的看法。