如何在Linux上使用g ++构建和使用GoogleTest共享库(.so)?

时间:2018-08-13 05:28:09

标签: gcc g++ shared-libraries googletest

  

注意,它不是this questionthis question的副本。

如何使用g ++从源代码构建Googletest到共享库(.so)中?

我尝试了Google Test's document中描述的有关如何建立共享库的步骤,但是将生成的libgtest.so与我的测试程序链接不起作用-链接器抛出 tons 之类的错误:

  

“ gtest-all.cc :(。text + 0x19b50):`testing :: internal :: HasNewFatalFailureHelper :: ~~ HasNewFatalFailureHelper()'libgtest.so:gtest-all.cc:(.text+0x19b50 ):首先在这里定义   ./libgtest.so:在函数testing :: internal :: HasNewFatalFailureHelper ::〜HasNewFatalFailureHelper()中:“   gtest-all.cc:(.text+0x19bc4):`testing :: internal :: HasNewFatalFailureHelper :: ReportTestPartResult(testing :: TestPartResult const&)'的多个定义   libgtest.so:gtest-all.cc:(.text+0x19bc4):首先在这里定义   ./libgtest.so:在函数testing :: internal :: TypedTestCasePState :: VerifyRegisteredTestNames(char const *,int,char const *)':

构建libgtest.so时,我使用了命令:

g++ -fPIC -DGTEST_CREATE_SHARED_LIBRARY=1 -pthread -c $(GTEST)/src/gtest-all.cc -shared(此宏在上述Google测试的文档中是必需的),然后mv gtest-all.o libgtest.so

当与libgtest.so链接时,按照上述Google测试文档中的建议,我使用了加载标志-DGTEST_LINKED_AS_SHARED_LIBRARY=1。我还使用了-L标志来告诉g ++库在哪里。

注意::如果我选择从源代码构建libgtest.a存档并将我的测试程序与此存档相关联,那么一切都很好(有关如何构建它的说明,请参见{ {3}})。我想从libgtest.a切换到libgtest.so的原因是我希望可执行文件在运行时加载GoogleTest,因此链接可能会更快。

1 个答案:

答案 0 :(得分:0)

这是我找到的解决方案。

步骤1 。建立目标文件gtest-all.o

  

g ++ -fPIC -isystem ../path/to/googletest/include -I ../ utils / third-party / googletest / -pthread -c ../path/to/googletest/src/gtest-all。 cc

GoogleTest's doc建议将宏标志-DGTEST_CREATE_SHARED_LIBRARY=1添加到上述命令中。

第2步。编译共享库

  

g ++ -fPIC-共享的gtest-all.o -o libgtest.so

然后,以链接到共享库

确保使用-Wl,-rpath=./path/to/libgtest.so标志。 -Wl,-rpath之间没有空格(-Wl,option意味着将option传递给链接器more on -Wl,option)。建议添加标志-DGTEST_LINKED_AS_SHARED_LIBRARY=1