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

时间:2019-07-24 20:11:27

标签: install googletest gmock conan

我遇到的问题是,当'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.

如果我删除该行并从柯南数据库中删除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(在要求柯南安装gtest之前,我删除了实际的$ {CONAN_LIBS}并将其替换为以前的值。)

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的选项,还是最新的gtest不包含gmock

1 个答案:

答案 0 :(得分:1)

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

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

如您所见, no_main 是错误的-这就是为什么当您与gtest链接时,还会从交付的gtest中获得主代码,这会隐藏您自己的主代码。

设置就足够了

[options]
gtest:no_main=True   

default_options = {"gtest:no_main":True}

如果您使用conanfile.py或像这样调用柯南

conan install . -o gtest:no_main=True 

如果您不想完全不修改conanfile。

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

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

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