我将几个.c文件打包成了静态库,
想用gtest做测试
于是写了几个test文件,写好了android.mk
但是编译提示
test-event.cpp:56: error: undefined reference to 'event_post(event_t*)'
找不到函数了。我查看过,我的静态库(libos.a和libcommon.a)已经生成,
和gtest用到的静态库(libgtest和libgtest_main)在同一个目录之前我将它们编成动态库的时候,可以生成可执行文件,
(只是修改下android.mk把libos和libcommon放到共享库的宏里面),这说明gtest的静态库连接正常。但是改成静态库之后就不行了,我怀疑是我的android.mk写的有问题。请大侠们帮忙看看android.mk如下:# Build the unit tests.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)ifneq ($(TARGET_SIMULATOR),true)# Build the unit tests.
test_src_files := \
test-thread.cpp \
test-mutex.cpp \
test-event.cpp 
shared_libraries := \
libz \
liblog \
libcutils \
libutils \
libstlport 
static_libraries := \
libos \
libcommon \
libgtest \
libgtest_main 
c_includes := \
    external/zlib \
    external/icu4c/common \
    bionic \
    bionic/libstdc++/include \
    external/gtest/include \
    external/stlport/stlport \
    external/vgx/libcommon/include \
    external/vgx/include \
    external/vgx/libos/include \
    external/vgx/libos/src/implementmodule_tags := eng tests$(foreach file,$(test_src_files), \
    $(eval include $(CLEAR_VARS)) \
    $(eval LOCAL_SHARED_LIBRARIES := $(shared_libraries)) \
    $(eval LOCAL_STATIC_LIBRARIES := $(static_libraries)) \
    $(eval LOCAL_C_INCLUDES := $(c_includes)) \
    $(eval LOCAL_SRC_FILES := $(file)) \
    $(eval LOCAL_MODULE := $(notdir $(file:%.cpp=%))) \
    $(eval LOCAL_MODULE_TAGS := $(module_tags)) \
    $(eval include $(BUILD_EXECUTABLE)) \
)endif

解决方案 »

  1.   

    呵呵,一起学习进步,
    刚开始以为是库文件没编进系统,
    我make clean
    然后再make
    花了两三个小时,悲剧了,结果还是一样的。
      

  2.   

    能问一下这是在做android底层开发吗?
      

  3.   

    不知道是不是我的静态库编错了
    这是我编静态库的amdroid.mkLOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)LOCAL_SRC_FILES:= \
    src/thread.c \
    src/mutex.c \
    src/system.c \
    src/event.c \
    src/implement/posix_thread.c \
    src/implement/posix_thread_mutex.c \
    src/implement/semaphore_event.c
    LOCAL_CFLAGS:= -DLOG_TAG=\"vgx-os\"# need "-lrt" on Linux simulator to pick up clock_gettime
    ifeq ($(TARGET_SIMULATOR),true)
    ifeq ($(HOST_OS),linux)
    LOCAL_LDLIBS += -lrt -lpthread
    endif
    endifLOCAL_SHARED_LIBRARIES := \
    libcutils \
    libutils LOCAL_C_INCLUDES := \
    ${LOCAL_PATH}/include \
    ${LOCAL_PATH}/../include \
    ${LOCAL_PATH}/../libcommon/include \
    ~/android/frameworks/base/include \
    ${LOCAL_PATH}/src/implementLOCAL_MODULE:= libos
    LOCAL_MODULE_TAGS := optional#TARGET_PRELINK_MODULE := falseinclude $(BUILD_STATIC_LIBRARY)
      

  4.   

    刚刚找到原因了,我的库文件的源代码都是C的,而gtest测试部分的代码都是cpp的,所以函数名字不一样了。
    解决办法,在源代码的头文件中,添加如下框架
    #ifdef _cplusplus
    extern "C"
    {
    #endif//....这里头文件中定义函数和结构等等
    #ifdef _cplusplus
    }
    #endif再次编译就好了用cpp的代码链接c函数库时,容易出现这种错误。