源码下载
参照thrift官网进行源码下载,本文采用
git clone https://github.com/apache/thrift.git
cd thrift
编译
通过查看Readme.md可发现编译过程为
./bootstrap.sh
./configure --with-ssl --with-ssl-path=/usr/local/lib/
make
make install
编译链接错误及修复
configure错误
在执行./configure时出现错误
cd tutorial/cpp && sed -e ‘/# am–include-marker/d’ Makefile | make -f - am–depfiles
这段代码的错误,是偶现的;打开tutorial/cpp/Makefile文件后,发现有一段rustc的版本信息前,缺了info: 字段,手动添加后,再次执行configure,能正常运行,并生成Makefile
编译错误及修复
在编译测试代码时,会提示如下错误
/usr/include/c++/11/bits/stl_map.h: In instantiation of ‘std::map<_Key, _Tp, _Compare, _Alloc>::map(_InputIterator, _InputIterator) [with _InputIterator = apache::thrift::TEnumIterator; _Key = int; _Tp = const char*; _Compare = std::less<int>; _Alloc = std::allocator<std::pair<const int, const char*> >]’:
gen-cpp/AnnotationTest_types.cpp:34:184: required from here
/usr/include/c++/11/bits/stl_map.h:275:38: error: no matching function for call to ‘std::_Rb_tree<int, std::pair<const int, const char*>, std::_Select1st<std::pair<const int, const char*> >, std::less<int>, std::allocator<std::pair<const int, const char*> > >::_M_insert_range_unique(apache::thrift::TEnumIterator&, apache::thrift::TEnumIterator&)’
275 | { _M_t._M_insert_range_unique(__first, __last); }

打开gen-cpp/AnnotationTest_types.cpp文件查看34行内容如下:
int _kweekdaysValues[] = {
weekdays::SUNDAY,
weekdays::MONDAY,
weekdays::TUESDAY,
weekdays::WEDNESDAY,
weekdays::THURSDAY,
weekdays::FRIDAY,
weekdays::SATURDAY
};
const char* _kweekdaysNames[] = {
"SUNDAY",
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY",
"SATURDAY"
};
const std::map<int, const char*> _weekdays_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(7, _kweekdaysValues, _kweekdaysNames), ::apache::thrift::TEnumIterator(-1, nullptr, nullptr));
看上去是初始化std::map<int, const char*>时出现了错误;经搜索发现,是::apache::thrift::TEnumIterator中缺少了对应的型别定义
// 为 TEnumIterator 特化 iterator_traits
namespace std {
template <>
struct iterator_traits<apache::thrift::TEnumIterator> {
using value_type = int; // 迭代器指向的元素类型(枚举值)
using difference_type = std::ptrdiff_t; // 迭代器差值类型
using pointer = int*; // 指针类型
using reference = int&; // 引用类型
using iterator_category = std::input_iterator_tag; // 迭代器类别(输入迭代器)
};
}

链接错误及修复
在链接过程中会出现如下错误
libtool: link: g++ -std=c++11 -Wall -Wextra -pedantic -g -O2 -o .libs/Benchmark Benchmark.o -L/usr/lib/x86_64-linux-gnu ./.libs/libtestgencpp.a thrift/lib/cpp/.libs/libthrift.so -L/usr/local/lib -lssl -lcrypto -lrt -lpthread
thrift/lib/cpp/.libs/libthrift.so: undefined reference to `SSL_get_peer_certificate'
通过nm 查看libssl.so中的符号表如下:
$ nm /usr/local/lib/libssl.so | grep "SSL_get_peer_certificate"
0000000000047504 T SSL_get_peer_certificate
libssl.so是有SSL_get_peer_certificate这个符号的定义的,遂通过ldd查看libthrift.so的符号链接
$ ldd lib/cpp/.libs/libthrift.so
linux-vdso.so.1 (0x00007ffeba3c6000)
libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x00007f0263281000)
libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007f0262e3d000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0262c11000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0262b2a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0262901000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f02628df000)
/lib64/ld-linux-x86-64.so.2 (0x00007f02633f7000)
发现libthrifht.so链接到了 libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3,而在configure中指定的–with-ssl-path=/usr/local/lib/并没有生效,打开lib/cpp/Makefile后发现,
libthrift_la_LIBADD = $(BOOST_LDFLAGS) $(OPENSSL_LDFLAGS) $(OPENSSL_LIBS)
在链接的过程中,会优先选择排在前面的path,因为$(BOOST_LDFLAGS)=/lib/x86_64-linux-gnu/,所以在查找libssl的时候,使用了 /lib/x86_64-linux-gnu/libssl.so.3 ,而指定的OPENSSL_LIBS没有产生效果,所以可以通过改变路径查找顺序的方式进行解决;修改lib/cpp/Makfile.am如下:
diff --git a/lib/cpp/Makefile.am b/lib/cpp/Makefile.am
index 3d7beab68..81c1d472b 100644
--- a/lib/cpp/Makefile.am
+++ b/lib/cpp/Makefile.am
@@ -33,7 +33,7 @@ pkgconfigdir = $(libdir)/pkgconfig
lib_LTLIBRARIES = libthrift.la
pkgconfig_DATA = thrift.pc
libthrift_la_LDFLAGS = -release $(VERSION)
-libthrift_la_LIBADD = $(BOOST_LDFLAGS) $(OPENSSL_LDFLAGS) $(OPENSSL_LIBS)
+libthrift_la_LIBADD = $(OPENSSL_LDFLAGS) $(BOOST_LDFLAGS) $(OPENSSL_LIBS)
而后重新执行
./bootstrap.sh
./configure --with-ssl --with-ssl-path=/usr/local/lib/
make
make install
再次检查libthrifht.so的链接
$ ldd lib/cpp/.libs/libthrift.so
linux-vdso.so.1 (0x00007ffd3bf98000)
libssl.so.1.1 => /usr/local/lib/libssl.so.1.1 (0x00007f254a60a000)
libcrypto.so.1.1 => /usr/local/lib/libcrypto.so.1.1 (0x00007f254a2b5000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f254a089000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2549fa2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2549d79000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2549d57000)
/lib64/ld-linux-x86-64.so.2 (0x00007f254a797000)
发现,已经正确链接到了/usr/local/lib/libssl.so
同时整个过程也能正确运行完成。
安装
执行
sudo make install
安装报错及修复
后会出现如下错误
make[2]: Entering directory '~/source_code/thrift/tutorial/rs'
../../compiler/cpp/thrift -out src --gen rs -r ../../tutorial/tutorial.thrift
.cargo/bin/cargo build
Compiling libc v0.2.174
Compiling autocfg v1.5.0
Compiling bitflags v1.2.1
Compiling unicode-width v0.1.14
Compiling ansi_term v0.11.0
Compiling strsim v0.8.0
Compiling vec_map v0.8.2
Compiling byteorder v1.5.0
Compiling integer-encoding v3.0.4
Compiling log v0.4.27
Compiling uuid v1.17.0
error: the `-Z unstable-options` flag must also be passed to enable the flag `check-cfg`
error: the `-Z unstable-options` flag must also be passed to enable the flag `check-cfg`
error: the `-Z unstable-options` flag must also be passed to enable the flag `check-cfg`
error: could not compile `libc` (build script)
Caused by:
process didn't exit successfully: `rustc --crate-name build_script_build --edition=2021 /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/libc-0.2.174/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=166 --crate-type bin --emit=dep-info,link -C embed-bitcode=no '--allow=clippy::used_underscore_binding' --allow=unused_qualifications '--warn=clippy::unnecessary_semicolon' '--allow=clippy::unnecessary_cast' '--allow=clippy::uninlined_format_args' '--warn=clippy::ptr_as_ptr' '--allow=clippy::non_minimal_cfg' '--allow=clippy::missing_safety_doc' '--warn=clippy::map_unwrap_or' '--warn=clippy::manual_assert' '--allow=clippy::identity_op' '--warn=clippy::explicit_iter_loop' '--allow=clippy::expl_impl_clone_on_copy' --cfg 'feature="default"' --cfg 'feature="std"' --check-cfg 'cfg(docsrs)' --check-cfg 'cfg(feature, values("align", "const-extern-fn", "default", "extra_traits", "rustc-dep-of-std", "rustc-std-workspace-core", "std", "use_std"))' -C metadata=a4571df0dc2cd0b0 -C extra-filename=-a4571df0dc2cd0b0 --out-dir /home/yuan/source_code/thrift/tutorial/rs/target/debug/build/libc-a4571df0dc2cd0b0 -L dependency=/home/yuan/source_code/thrift/tutorial/rs/target/debug/deps --cap-lints allow` (exit status: 1)
warning: build failed, waiting for other jobs to finish...
error: could not compile `autocfg` (lib)
通过该错误查找解决方案,貌似都是使用nightly工具链进行修复的;但是不使用sudo,在tutorial/rs目录下执行make install不会报错,看上去应该是sudo后有环境变量未对应上导致的问题,所以通过
sudo -E make install
方式进行修复。
验证
$ thrift --version
Thrift version 0.22.0
至此,thrift已经完成安装
总结
通过以上步骤,完成了thrifht的编译,链接及安装;每一步都会出现问题,把遇到的问题交给豆包或者deepseek也都能给出提示进行修复;但是有些答案可能会指向不太准确的方向;所以记录下来以上解决过程,以期后续能够更加高效的解决问题。
在解决以上问题中,ldd,nm查看库连接库,及查看库的符号,是之前经常使用的定位及查看库连接的问题;sudo -E也是首次在解决问题当中,发现的新技能。

4302

被折叠的 条评论
为什么被折叠?



