Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3430789
  • 博文数量: 864
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10634
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(864)

文章存档

2023年(1)

2021年(1)

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: C/C++

2010-12-01 12:54:47

如何往自己编译的opencore里面添加自己的项目:

这里分为两种情况来说,

如果你要添加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的语法并不是很熟悉,以上的解决方法我自己感觉也不是最好的。只是目前还是可以方便的用。

希望路过的有经验有想法的人发表下自己的看法。

阅读(1118) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~