10

簡単なテストファイルTestMe.cppがあります。

#include <gtest/gtest.h>

TEST(MyTest, SomeTest) {
  EXPECT_EQ(1, 1);
}

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

GoogleTestを静的ライブラリとして構築しています。(関連する場合は、makefileを提供できます。)

TestMe.cppをコマンドラインから問題なくコンパイルできます。

g++ TestMe.cpp -IC:\gtest-1.5.0\gtest-1.5.0\include -L../gtest/staticlib -lgtest -o TestMe.exe

期待どおりに動作します。

ただし、これをQtでコンパイルすることはできません。同じディレクトリにある私のQtプロジェクトファイル:

SOURCES += TestMe.cpp
INCLUDEPATH += C:\gtest-1.5.0\gtest-1.5.0\include
LIBS += -L../gtest/staticlib -lgtest

これにより、gtest関数に関連する17個の「未解決の外部シンボル」エラーが発生します。

簡単なことだと思うので、ここで髪を引っ張っています。何か案は?

未定義の外部シンボルの一部を次に示します。

TestMe.obj:-1: error:  unresolved external symbol "public: int __thiscall testing::UnitTest::Run(void)" (?Run@UnitTest@testing@@QAEHXZ) referenced in function _main
TestMe.obj:-1: error:  unresolved external symbol "public: static class testing::UnitTest * __cdecl testing::UnitTest::GetInstance(void)" (?GetInstance@UnitTest@testing@@SAPAV12@XZ) referenced in function _main
TestMe.obj:-1: error:  unresolved external symbol "void __cdecl testing::InitGoogleTest(int *,char * *)" (?InitGoogleTest@testing@@YAXPAHPAPAD@Z) referenced in function _main
TestMe.obj:-1: error:  unresolved external symbol "public: __thiscall testing::internal::AssertHelper::~AssertHelper(void)" (??1AssertHelper@internal@testing@@QAE@XZ) referenced in function "private: virtual void __thiscall MyTest_SomeTest_Test::TestBody(void)" (?TestBody@MyTest_SomeTest_Test@@EAEXXZ)
4

3 に答える 3

7

これを静的ライブラリとして機能させることはできませんでしたが、DLLとして機能しています。

まず、GoogleTestをDLLとしてビルドする必要がありました。これをVisualStudioで機能させることに成功しなかったので、mingw32-makeを使用しました。ソースで提供されているMakefileを使用して、次の変更を加えることができます。

gtest-all.o : $(GTEST_SRCS_)
    $(CXX) $(CPPFLAGS) -DGTEST_CREATE_SHARED_LIBRARY=1 -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest-all.cc

gtest_main.o : $(GTEST_SRCS_)
    $(CXX) $(CPPFLAGS) -DGTEST_CREATE_SHARED_LIBRARY=1 -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest_main.cc

gtest.dll : gtest-all.o
    $(CXX) -shared -o $@ $^ -Wl,--out-implib,gtest_dll.lib

gtest_main.dll : gtest-all.o gtest_main.o
    $(CXX) -shared -o $@ $^ -Wl,--out-implib,gtest_main_dll.lib

次に、テストプロジェクトをコンパイルするときに、次のことを行う必要があります。

  • GTEST_LINKED_AS_SHARED_LIBRARY=1を定義します
  • ライブラリ参照をgtest_dll.libまたはgtest_main_dll.libのいずれかに設定します。
  • gtest.dllまたはgtest_main.dllを実行可能ファイルと同じディレクトリに貼り付けます。

(私の理解では、独自のmain()関数を提供していない場合にのみgtest_mainを使用します。)

これは私が持っているものに基づいたサンプルのQtプロファイルですこれは(ついに!)動作しています:

DEFINES += GTEST_LINKED_AS_SHARED_LIBRARY=1
SOURCES += main.cpp MyClassTests.cpp
INCLUDEPATH += ../path/to/gtest/includes
LIBS += -L../path/to/gtest/libraries -lgtest_dll \
    -L../ClassLibrary/bin -lMyClass
CONFIG += console
于 2010-05-07T20:24:15.527 に答える
3

Qt + gtest/gmockを問題なく使用しています。スラッシュが異なる絶対パス/相対パスのすべての可能な組み合わせをテストしましたが、問題を再現できませんでした。qmakeによって生成されたMakefile.Debugから「LIBS」変数の内容を確認しましたか?

一般的なアドバイスを次に示します。コードをまったく同じ場所にダウンロードしない限り、コードは自分以外のマシンではコンパイルされないため、絶対パスを使用しないでください(Qtの設定が異なるために実行できない場合があります)。など)。代わりに、サードパーティのライブラリにも相対パスを使用してください。

私はサードパーティのライブラリをバージョン管理システムに保持しています(あなたはそれを使用していますよね?)。「サードパーティ」ディレクトリがあり、それらのライブラリを使用するプロジェクトごとに、明示的に指定されたバージョンのサードパーティライブラリを指すsvn:externalプロパティを追加します。最後の部分は重要です。サードパーティのライブラリを更新する場合でも、プロジェクトのすべてのリビジョンをビルドできるようになるためです。

于 2010-05-06T19:17:22.323 に答える
0

qmakeファイルは大丈夫だと思います。しかし、INCLUDEPATHが絶対的でLIBSが相対的であるのはなぜですか。LIBSabsoluteも設定してみます。

ここから http://doc.trolltech.com/4.6/qmake-variable-reference.html#includepath

しかし、主な問題は(私が思うに)INCLUDEPATHにスラッシュを入れる必要があるということです。ドキュメントでは、このようになっています。

INCLUDEPATH += C:/gtest-1.5.0/gtest-1.5.0/include
于 2010-05-06T18:45:06.253 に答える