安装 gtest 后,gmock_main.cc 替换了我的 main.cc

After installing gtest, gmock_main.cc replaces my main.cc

我发现当 'conan' 安装 'gtest' 时,我的 'gmock_main' 以某种方式替换了我的 'main'。

我正在一步一步地向我的程序中添加更多的库,使用越来越多的行来conanfile.txt,清除子目录build中生成的文件,以及运行 "cmake..; cmake --build ." .在此之后,我 运行 构建了二进制文件。

我的conanfile.txt是

[requires]
SystemC/2.3.3@minres/stable
SystemCVerification/2.0.1@minres/stable
doxygen_installer/1.8.15@bincrafters/stable
qt/5.12.0@bincrafters/stable
gtest/1.8.1@bincrafters/stable
#flex/2.6.4@bincrafters/stable

[generators]
cmake

[options]
SystemC:stdcxx=14
SystemCVerification:stdcxx=14

直到我添加行

gtest/1.8.1@bincrafters/stable

一切看起来都是文件,我的二进制文件启动并生成我想要的。安装 gtest 后,我​​自己的非 GTEST 相关程序的回复从

       SystemC 2.3.3-Accellera --- Jun 15 2019 21:14:08
        Copyright (c) 1996-2018 by all Contributors,
        ALL RIGHTS RESERVED
 Correct usage:

Running main() from gmock_main.cc
[==========] Running 0 tests from 0 test cases.
[==========] 0 tests from 0 test cases ran. (0 ms total)
[  PASSED  ] 0 tests.

如果我删除该行并从 conan 数据库中删除 gtest,重建我的二进制文件,它又可以正常工作了。我不知道,什么会导致这样一个奇怪的错误?去哪里找原因?可能是偶然的名字响起?

提交后:

我猜这个问题不知何故是由gtest引起的。所以我做了以下内容: 我保存了 ${CONAN_LIBS} 的值 没有和有行

gtest/1.8.1@bincrafters/stable

活跃于我的 conanfile.txt

scv;
systemc;ssl;crypto;pcre2-posix;pcre2-8;pcre2-16;pcre2-32;double-conversion;
freetyped;harfbuzz;jpeg;sqlite3;pgcommon;pq;pthread;odbc;odbccr;odbcinst;ltdl;dl;bz2;png16d;m;z

以及 gtest:

scv;
gmock_maind;gmockd;gtestd;
systemc;ssl;crypto;pcre2-posix;pcre2-8;pcre2-16;pcre2-32;double-conversion;
freetyped;harfbuzz;jpeg;sqlite3;pgcommon;pq;pthread;odbc;odbccr;odbcinst;ltdl;dl;bz2;png16d;m;z

为了更好的可见性,我将第二行分开,实际上包含与可疑行一起安装的库的名称。之后,我编辑了相应的 CMakeLists.txt(我删除了实际的 ${CONAN_LIBS} 并将其替换为以前的值,然后要求柯南安装 gtest。)

target_link_libraries(A
#    ${CONAN_LIBS}
scv;systemc;ssl;crypto;pcre2-posix;pcre2-8;pcre2-16;pcre2-32;double-conversion;freetyped;harfbuzz;jpeg;sqlite3;pgcommon;pq;pthread;odbc;odbccr;odbcinst;ltdl;dl;bz2;png16d;m;z
)

而且,我的应用程序按预期运行。这里发生了什么? gmock_main.cc如何替换我自己的.cc? (实际上,一个 int sc_main(int argc,char *argv[]) 但可能没有区别)或更好:我怎样才能避免它?

我明白 'main' 库中的调用可以代替我自己的 'main'。 为什么是库中的主要功能以及如何避免它(我的意思是除了进行此手动编辑之外的其他方式)。

第二次编辑: 我还注意到,如果我离开

${CONAN_LIBS} 在测试分支中,gmock_maind; 接管控制权:它已经将我的测试放入自己的主程序中, 因为我使用的是基于 System C 的主程序(即 int sc_main(int argc, char* argv[]) ),它对我来说并不是很好。最后,我再次编辑了柯南安装库列表并删除了

gmock_maind;gmockd;

现在我的应用程序终于达到了我的预期。

这并不像我预期的那样容易。 据我所知,自 1.8.0 以来 gmockgtest 是一个包。我不需要 gmock 但没关系。但是添加 gmock_maind 的原因是什么,它杀死了所有子项目,除了那些用于 havin genter 代码的子项目,这里是一个 gmock 主测试文件,没有别的。

是否有一些选项可以摆脱这个 gmock_maind,或者 whihc 是不包含 gmock 的最新 gtest

我想这是由 gtest 包的标准选项行为引起的。 这些是 gtest 1.10 的默认选项:

   default_options = {"shared": False, "build_gmock": True, "fPIC": True, "no_main": False,"debug_postfix": 'd', "hide_symbols": False}

如您所见,no_main 是错误的 - 这就是为什么当您 link 反对 gtest 时您也从 gtest 交付的主要内容, 它隐藏了你自己的 main.

设置

应该够了
[options]
gtest:no_main=True   

default_options = {"gtest:no_main":True}

如果你使用 conanfile.py 或者像

这样调用柯南
conan install . -o gtest:no_main=True 

如果您根本不想修改您的 conanfile。

我建议使用新的 conan-center https://conan.io/center/gtest/1.10.0/?user=&channel=&revision=&os=&tab=recipe,因为它是 conan 包的最新且维护最好的站点。

要了解有关设置柯南选项的更多信息,请查看此处:https://docs.conan.io/en/latest/reference/conanfile/attributes.html#options

编辑: 在你的具体情况下,linker 选择 gmocks main 而不是你的,而不是抱怨多个定义的符号的原因是你使用了 systemcs 的 sc_main - main,这实际上不是入口点(名称必须始终为 "main"),但在 systemsc 内部有一个调用您的 sc_main 的主要函数,就好像它是实际的入口点一样。我假设 systemsc 中还有一个预处理器机制,可以防止在其他地方定义另一个标准主函数时出现 linker 错误。在此处阅读更多信息:https://forums.accellera.org/topic/5932-how-exactly-sc_main-works/