2014-04-19 29 views
5

Android NDK ile Google Test kullanmaya çalışıyorum. NDK README example here, şu benim Android.mk ve aşağıdaki gibi tek bir test kurdum ama bu hatayı alıyorum:undefined başvuru 'test için testin' türündeki testi 'Google'da Test' ile test et NDK

  • ::testing::Test geçerli:

    İşte
    ./obj/local/armeabi/objs-debug/ndkfoo_unittest/FilteredPriorityQueue_test.o:FilteredPriorityQueue_test.cpp:function typeinfo for mashbot::FilteredPriorityQueueTest_ShouldRetrieveTop_Test: error: undefined reference to 'typeinfo for testing::Test' 
    collect2: error: ld returned 1 exit status 
    make: *** [obj/local/armeabi/ndkfoo_unittest] Error 1  
    

    şimdiye kadar bildiklerimiz Google Test sınıfı otomatik olarak TEST() makrosu tarafından alt sınıflara ayrılır.

  • undefined reference to 'typeinfo for hataları, genellikle, linker sanal bir yöntem için tanım bulamıyorsa oluşur. Statik google test kütüphanesini kullanıyorum ve bayraklar iki modülden aynı olduğu için, buradaki durum burada olmamalıdır, ancak.

Neyi eksik? Ya da sonra nereye bakabilirim? Teşekkürler!

güncelleme: Ben ndkfoo_unittest modülünden SHARED_LIBRARIES, CPP_FLAGS ve LDLIBS kaldırırsanız Boost veya Android yerel apis böyle bir şey bağlı değildir, basit bir Google Testini inşa edebilirsiniz.

Yapı komut:

ndk-build SHELL=/bin/bash NDK_DEBUG=1 

FilteredPriorityQueue_test.cpp:

#include "gtest/gtest.h" 

// FilteredPriorityQueue is a header-only file with no virtual methods. 
#include "FilteredPriorityQueue.h" 

// So is Comparator. 
#include "Comparator.h" 

struct MaskedObject { 
    int mMask; 
    MaskedObject(int mask) : mMask(mask) { } 
    int getMask() const { return mMask; } 
    bool operator<(const MaskedObject& rhs) const { 
      return this->mMask < rhs.mMask; 
    } 
}; 

typedef 
FilteredPriorityQueue<int, MaskedObject, Comparator<MaskedObject> > TestQueue; 

TEST(FilteredPriorityQueueTest,ShouldRetrieveTop) { 
    Comparator<MaskedObject> comparator(Comparator<MaskedObject>::LESS); 
    TestQueue q(comparator); 
    q.push(1, MaskedObject(1)); 
    q.push(2, MaskedObject(2)); 
    q.push(4, MaskedObject(4)); 
    EXPECT_EQ(1, q.top().getMask()); 
} 

Android.mk: Bir öneri istemek Eh eğer

# ndkfoo module 
#------------------------- 
LOCAL_MODULE := ndkfoo 

LOCAL_CPPFLAGS := -frtti -pthread -fexceptions -std=c++11 
LOCAL_LDLIBS += -lOpenSLES -llog -landroid 

LOCAL_C_INCLUDES += $(LIBMASHBOT_ROOT)/include 
LOCAL_C_INCLUDES += $(BOOST_INCLUDE_PARENT) 

LOCAL_SHARED_LIBRARIES += mashbot \ 
     gnustl_shared \ 
     boost_thread-gcc-mt-1_53 \ 
     boost_system-gcc-mt-1_53 \ 
     $(BOOST_LIB) 

LOCAL_SRC_FILES := ndkfoo.cpp \ 
     #...more files... 

include $(BUILD_SHARED_LIBRARY) 


# ndkfoo tests module 
#------------------------- 
include $(CLEAR_VARS) 
LOCAL_MODULE := ndkfoo_unittest 

LOCAL_CPPFLAGS := -frtti -pthread -fexceptions -std=c++11 

LOCAL_C_INCLUDES += $(BOOST_INCLUDE_PARENT) 

LOCAL_STATIC_LIBRARIES := googletest_main 
LOCAL_SHARED_LIBRARIES += ndkfoo \ 
     gnustl_shared \ 
     $(BOOST_LIB) 

LOCAL_SRC_FILES := FilteredPriorityQueue_test.cpp 

include $(BUILD_EXECUTABLE) 

# this imports $NDK/sources/third_party/googletest/Android.mk 
$(call import-module,third_party/googletest) 
+0

Bize ndkfoo_unittest' için linker komut satırını göstermelisiniz. –

+0

@MikeKinghan Elbette. Bunu soruyu ekledim. Ve ben 'BOOST_INCLUDE_PARENT' gibi şeyler için ortam değişkenleri var. Bunlar doğru çalışıyor. – mxdubois

+0

Bu, linker komutu değil, 'ndk-build' komutu. Yapı, kaynak dosyalarınızı derledikten sonra, yürütülebilir dosyanızı oluşturmak için linker ('ld') çağırır. Ürettiği 'ld' komut satırına ihtiyacımız var. Bize bir bağlantı hatası gösteriyorsunuz ama bize neyin bağlı olduğunu göstermiyorsunuz. –

cevap

1

... sadece basit şeyleri tutmak. Durumda, google testini kullanarak C++ yerel kodu üzerinde bir test yapmanız gerekiyorsa, önce masaüstü için google testi yapın. Şimdiye kadar anlayabiliyorum, görünüşe göre gerçekten de tam olarak işlevsel değil - en azından herhangi bir gerçek dünya projesi için gerçekten işe yaradığını gösteren hiçbir malzeme veya öğretici bulamadım.

Şimdilik yapabileceğiniz şey şudur: C++ cihazınızı cihazınızda test etmek için JNI ile JNI kullanın. İşe yarayan yol budur. Gelecekte google testinin Android NDK için gerçekten işe yaramasını umuyorum.

Burada daha ayrıntılı tartışmayı bulabilirsiniz: Unit Tests with NDK.

2

Bunun nedeni, RTTI'nın etkin olmamasıdır. Application.mk adresine

APP_CPPFLAGS += -fexceptions 
APP_CPPFLAGS += -frtti 

eklemeyi deneyin. Bu benim için çözdü. belgelere göre, Android.mk içinde

LOCAL_CPP_FEATURES := rtti exceptions 

belirtmek gerekir, ama bu NDK R10C kullanarak benim için çalışmadı. Ayrıca, RTTI'yı etkinleştirmek için istisnaların etkinleştirilmesinin zorunlu olmadığını, ancak RTTI kullanan kodun RTTI'yi destekleyen standart bir kütüphaneye bağlanmasının gerekeceğini ve RTTI'ye sahip kütüphanelerin de istisnaları destekleyeceğini unutmayın.

0

Sizinle aynı sorunu yaşıyorum. Jim doğru, RTTI yüzünden.Çalışmasını sağlamak için, RTTI etkinken libgtest.a'nızı da oluşturmanız gerekir. YOu, LOCAL_CFLAGS: = -fexceptions -frtti dosyasını test için Android.MK içine ekleyebilir ve .a dosyasını yeniden oluşturabilirsiniz. Daha sonra projenizi oluşturmak için yeni .a dosyasını kullanın. Denedim ve benim için iyi çalışıyor. :)

İlgili konular