thrift源码编译安装

源码下载

参照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也是首次在解决问题当中,发现的新技能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大明__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值