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

How to build and use GoogleTest shared library (.so) using g++ on Linux?

NOTE it's not a duplicate of this question or .

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

我尝试了 Google Test's document 中描述的关于如何构建共享库的步骤,但是 link 使用我的测试程序生成的 libgtest.so 没有工作 - linker 抛出 错误,例如:

"gtest-all.cc:(.text+0x19b50): multiple definition of `testing::internal::HasNewFatalFailureHelper::~HasNewFatalFailureHelper()'libgtest.so:gtest-all.cc:(.text+0x19b50): first defined here ./libgtest.so: In function `testing::internal::HasNewFatalFailureHelper::~HasNewFatalFailureHelper()':" gtest-all.cc:(.text+0x19bc4): multiple definition of `testing::internal::HasNewFatalFailureHelper::ReportTestPartResult(testing::TestPartResult const&)' libgtest.so:gtest-all.cc:(.text+0x19bc4): first defined here ./libgtest.so: In function `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

当 link 使用 libgtest.so 时,我使用了加载标志 -DGTEST_LINKED_AS_SHARED_LIBRARY=1,正如前面提到的 Google 测试文档中所建议的那样。我还使用 -L 标志告诉 g++ 库在哪里。

注意: 如果我选择从源代码构建一个 libgtest.a 存档并且 link 我的测试程序使用这个存档,一切都很好(说明如何构建它也在 Google Test document) 中。我想从 libgtest.a 切换到 libgtest.so 的原因是我希望可执行文件在运行时加载 GoogleTest,这样 linking 可能会更快。

这是我找到的解决方案。

步骤 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 -shared gtest-all.o -o libgtest.so

Then,到link对共享库

一定要使用-Wl,-rpath=./path/to/libgtest.so标志。 -Wl,-rpath之间没有白space(-Wl,option就是把option传给linker。more on -Wl,option)。建议添加flag -DGTEST_LINKED_AS_SHARED_LIBRARY=1.