我将几个.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
想用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
刚开始以为是库文件没编进系统,
我make clean
然后再make
花了两三个小时,悲剧了,结果还是一样的。
这是我编静态库的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)
解决办法,在源代码的头文件中,添加如下框架
#ifdef _cplusplus
extern "C"
{
#endif//....这里头文件中定义函数和结构等等
#ifdef _cplusplus
}
#endif再次编译就好了用cpp的代码链接c函数库时,容易出现这种错误。