Closed yinghaoyu closed 11 months ago
没太理解,是说编译以后直接运行compression_test gzip
失败了吗,但是这个compression_test感觉接受不了参数啊🤔
第1个用例SetUp()
函数会读取参数的。第2个用例是正常的,作为参照。
我还是没理解是怎么从命令行读到的gzip,要么cout一下看看是不是真的读到了?
./compression_test gzip
这里的gzip
是输入参数,看这个用例代码应该是需要入参的
std::string Compress(
std::function<bool(Compressor*, CompressionOutputStream* out)> f) {
if (!with_test_output_stream_) {
NoncontiguousBufferBuilder builder;
NoncontiguousBufferCompressionOutputStream out(&builder);
// Setup()函数解析后,这里method_为入参值gzip
auto&& c = MakeCompressor(method_); // 调试这里一直返回nullptr
EXPECT_TRUE(c);
这是第一个用例的问题。
第二个用例是直接代码里写的MakeCompressor(“gzip”)
,能正常得到Compressor
。
两个用例同样是MakeCompressor(“gzip”)
,结果第一个用例在EXPECT_TRUE(c);
失败了。
你的执行方式是
~/flare/build64_release/flare/base/compression_test.runfiles]% LD_LIBRARY_PATH=. ../compression_test gzip
这样吗
我这样执行看起来命令行参数gzip
被忽略了,跟直接执行LD_LIBRARY_PATH=. ../compression_test
效果是一样的
你也可以试试把method_
打出来看看是不是符合预期的内容
你看的是第二个用例,这个是对的。我说的是第一个用例,method_
打印是符合我预期的。
你运行的是master代码生成的flare/base/compression/compression_test
吗?
我试了下不管不传命令行参数或者传命令行参数gzip
,输出是一样的。而且根据我的理解,gtest也不会因为命令行传入了一个不以-
开头的参数就改变行为。
确实是master
分支代码,不过我自己用cmake
管理的。那就奇怪了,感觉像是auto&& c = MakeCompressor(method_);
早于全局变量FLARE_COMPRESSION_REGISTER_COMPRESSOR("gzip", GzipCompressor);
的初始化,只有这种情况才会出错,但是用例2
却正常运行。。。
用cmake的话注意一下https://github.com/Tencent/flare/blob/master/flare/base/compression/BUILD#L55 link_all_symbols,对应于-Wl,--whole-archive
不然链接器可能会把自动注册的这些文件丢掉
https://stackoverflow.com/questions/805555/ld-linker-question-the-whole-archive-option
谢谢,原来如此。
https://github.com/Tencent/flare/tree/master/flare/base/compression/compression_test.cc 运行
./compression_test gzip
https://github.com/Tencent/flare/blob/master/flare/base/compression_test.cc 这个用例正常运行。
gzip
都已经在cpp文件FLARE_COMPRESSION_REGISTER_COMPRESSOR("gzip", GzipCompressor);
注册过了,这是啥情况?