安装 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 以来 gmock
和 gtest
是一个包。我不需要 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/
我发现当 '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 以来 gmock
和 gtest
是一个包。我不需要 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/