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)
Bize ndkfoo_unittest' için linker komut satırını göstermelisiniz. –
@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
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. –