与GMock一起使用Clang ++ undefined引用错误

时间:2016-04-15 04:54:12

标签: c++ clang++ gmock

昨天我做了一个dist-upgrade,现在我在使用GMock和clang ++编译测试时遇到了未定义的引用错误;它可以正常使用g ++。 GTest和GMock从源代码编译并与Cmake一起安装。

我想知道是否有人知道为什么它没有正确连接?

我正在编译:

        clang++-3.7 -Wall -Wextra -pedantic -std=c++11 -Wshadow a.cpp -o a.out -lgtest -lgmock -pthread

我正在接受这些错误:

            /tmp/a-bb74fa.o: In function `testing::internal::FunctionMockerBase<int ()>::DescribeDefaultActionTo(std::tuple<> const&, std::ostream*) const':
            a.cpp:(.text._ZNK7testing8internal18FunctionMockerBaseIFivEE23DescribeDefaultActionToERKSt5tupleIJEEPSo[_ZNK7testing8internal18FunctionMockerBaseIFivEE23DescribeDefaultActionToERKSt5tupleIJEEPSo]+0x8e): undefined reference to `testing::internal::FormatFileLocation(char const*, int)'
            /tmp/a-bb74fa.o: In function `testing::internal::ExpectationBase::DescribeLocationTo(std::ostream*) const':
            a.cpp:(.text._ZNK7testing8internal15ExpectationBase18DescribeLocationToEPSo[_ZNK7testing8internal15ExpectationBase18DescribeLocationToEPSo]+0x43): undefined reference to `testing::internal::FormatFileLocation(char const*, int)'
            clang: error: linker command failed with exit code 1 (use -v to see invocation)
            make: *** [a.out] Error 1

源代码:

                #include<gtest/gtest.h>
                #include<gmock/gmock.h>
                #include <iostream>

                class printable{
                    public:
                        virtual int print() = 0;
                };

                class A{
                    public:
                        A( printable* b ) :
                            obj( b )
                        {}
                        int doit(){return obj->print();}
                    private:
                        printable* obj;
                };

                class MockPrintable : public printable{
                    public:
                        MOCK_METHOD0( print, int() );
                };

                TEST( test, returnStuff ){
                    MockPrintable b;
                    A a( &b );
                    EXPECT_CALL( b, print() )
                    .WillOnce( testing::Return( 1 ) )
                    .WillOnce( testing::Return( 2 ) )
                    .WillOnce( testing::Return( 3 ) );
                    EXPECT_EQ( 1,a.doit() );
                    EXPECT_EQ( 2,a.doit() );
                    EXPECT_EQ( 3,a.doit() );
                }

                int main( int argc, char* argv[] ){
                    ::testing::InitGoogleMock( &argc, argv );
                    return RUN_ALL_TESTS();
                }

编辑:

我已将问题缩小到libgcc-5-devlibstdc++-5-dev 包。

libstdc++-5-dev导致此错误:

            /usr/local/include/gtest/gtest.h:54:10: fatal error: 'limits' file not
                        found
            #include <limits>

libstdc++-5-dev会导致很多未定义的引用错误 gmock。

我似乎无法使用-l-L链接旧版本。搜索 周围出现的结果建议不要试图静态链接这些 并使用旧版本的编译器。但是,编译器 根据apt-get,依赖关系现在需要相同的*-5-dev包。

您可以通过将此插入插入来阻止apt-get使用这些包 /etc/apt/preferences:

            Package: libgcc-5-dev
            Pin: release *
            Pin-Priority: -1

            Package: libstdc++-5-dev
            Pin: release *
            Pin-Priority: -1

并且只有dist-upgrade,但它可以阻止g ++,clang和其他东西 从更新,所以它是不值得的; apt-get建议删除clang作为其中一部分 无论如何dist-upgrade

最后,我尝试从他们的网站上使用预编译二进制文件来获取clang-3.8,但它给了我一个 未定义引用std ::&lt;的巨大墙一切&gt;。我确实得到了一个 你好编译的世界程序,所以它至少可以找到std::coutstd::endl

1 个答案:

答案 0 :(得分:1)

我认为你是v5中libstdc ++引入的ABI更改的受害者。他们不得不改变std::string的实现,因为C ++ 11强制要求特定的实现,而以前并非如此。这导致符号名称的更改。该问题特定于从v5之前的libstdc ++(gcc)迁移到v5或更高版本,因此不应再发生。