未定义对'的引用;用于测试的类型信息::Test';通过Android NDK上的Google测试

未定义对'的引用;用于测试的类型信息::Test';通过Android NDK上的Google测试,android,c++,android-ndk,makefile,googletest,Android,C++,Android Ndk,Makefile,Googletest,我正在尝试使用Android NDK的谷歌测试。接下来,我设置了我的Android.mk和一个测试,如下所示,但我得到了这个错误: ./obj/local/armeabi/objs-debug/ndkfoo_unittest/FilteredPriorityQueue_test.o:FilteredPriorityQueue_test.cpp:function typeinfo for mashbot::FilteredPriorityQueueTest_ShouldRetrieveTop_Te

我正在尝试使用Android NDK的谷歌测试。接下来,我设置了我的Android.mk和一个测试,如下所示,但我得到了这个错误:

./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    
以下是我目前所知道的:

  • ::testing::Test
    是由
    Test()
    宏自动子类化的Google测试类
  • 类型信息的未定义引用当链接器找不到虚拟方法的定义时,通常会发生错误
  • ,但这里不应该是这样,因为我使用的是静态google测试库,两个模块之间的标志是相同的
我错过了什么?或者我下一步可以去哪里?谢谢

更新:如果我从ndkfoo\u单元测试模块中删除共享库、CPP\u标志和ldlib,我可以构建一个简单的谷歌测试,它不依赖于Boost或Android原生api

生成命令:

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() );
}

如果你想要一个建议。。。保持简单。在你需要使用谷歌测试对C++本机代码进行测试的情况下,首先做为谷歌的桌面测试。p> 到目前为止,我可以说,显然它还不是真正的功能齐全-至少我没有找到任何有价值的材料或教程显示它真的适用于任何现实世界的项目

<>你现在能做的是:使用JNI与JNI测试你的C++嵌入到你的设备中。这就是我们的工作方式。我希望在未来的谷歌测试中,安卓NDK能真正发挥作用


在这里您可以找到关于它的进一步讨论:。

我相信这是因为您没有启用RTTI。尝试添加

APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -frtti
到Application.mk。这为我解决了问题。根据文档,您应该能够指定

LOCAL_CPP_FEATURES := rtti exceptions

在Android.mk中,但这对我使用ndkr10c不起作用。另外,请注意,启用RTTI并不强制启用异常,但使用RTTI的代码必须链接到支持RTTI的标准库,并且具有RTTI的库也支持异常。

我遇到了与您相同的问题。Jim是正确的,这是因为RTTI。为了让它工作,您还需要在启用RTTI的情况下构建libgtest.a。你可以加上
LOCAL_CFLAGS:=-feexceptions-frti在Android.MK中用于gtest并重建.a文件。然后使用新的.a文件来构建项目。我已经试过了,它对我来说很好。:

您需要向我们展示导致错误的
ndkfoo\u unittest
的链接器命令行。@MikeKinghan当然可以。我把它添加到问题中。我有一些环境变量,比如
BOOST\u INCLUDE\u PARENT
。这些都正常工作。这不是linker命令,而是
ndk build
命令。构建编译源文件后,将调用链接器(
ld
)来创建可执行文件。我们需要它生成的
ld
命令行。您正在向我们显示链接错误,但未向我们显示链接的内容。
LOCAL_CPP_FEATURES := rtti exceptions