iperf3 版本:
3.2
硬件:
x86_64
操作系统(和发行版,如果有的话):
Ubuntu下ARM的交叉编译
预期行为
构建静态链接的可执行文件
实际行为
使用动态链接库构建可执行文件
doru@doru-N551JK :~/Desktop/iperf$ 文件输出/bin/iperf3
output/bin/iperf3:ELF 32 位 LSB 可执行文件,ARM,EABI5 版本 1 (SYSV),动态链接(使用共享库),用于 GNU/Linux 2.6.32,BuildID[sha1]=6d84258ed9cbe40710234da5f5b1cf83644d not stripe
应用此补丁: https :
配置
./configure --without-openssl --host=arm-none-linux-gnueabi CC=arm-linux-gnueabi-gcc LD=arm-linux-gnueabi-ld CXX=arm-linux-gnueabi-g++ CFLAGS=-static CXXFLAGS=-static --enable-static --disable-shared --prefix=/home/doru/Desktop/iperf3/output
如果我使用上述步骤构建 iperf2(不是 iperf3),它会产生一个静态链接的可执行文件:
doru@doru-N551JK :~/Desktop/iperf-2.0.5/output/bin$ 文件 iperf
iperf:ELF 32 位 LSB 可执行文件,ARM,EABI5 版本 1 (SYSV),静态链接,用于 GNU/Linux 2.6.32,BuildID[sha1]=631918d87fb90840809bb5e5aa5b3d613bf1a775,未剥离
必须修改配置。
我确认这是一个问题(在 CentOS 7 和 FreeBSD 11 上测试,都是本机编译并且不需要交叉构建到另一个平台),但我还不知道为什么。 我们不经常测试此配置功能,但我_想_我曾见过它在过去的某个时间点工作。 我注意到出于某种原因,我们从未在configure.ac
执行LT_INIT
,但我不清楚这是否是一个因素。
请注意,iperf2 和 iperf3 是完全独立的程序,具有不同的构建基础结构。
另外,我猜这确实与 libtool 有关,这不是我的专长,因此如果有人拥有 libtool 技能,将不胜感激。
好的。 我在一些 CentOS 7 虚拟机上重新审视了这一点。 我重新了解到--enable-static --disable-shared
只是意味着不会构建共享库(在这种情况下libiperf.so
)。 CFLAGS=-static
尝试进行静态链接,但它要求安装libc-static
RPM 中的静态 C 库。 此外,SCTP 支持可能会破坏此平台上的构建,因为据我所知,CentOS 7 中没有包含静态库(仅限动态库)的lksctp-*
软件包。
所有这些都意味着我在实际构建静态链接的 iperf3 可执行文件时也遇到了麻烦,但这不是由于 iperf3 中的任何内容。
这确实是 libtool 的一个问题,现在已经讨论了 5 年多了。 请参阅关键:libtool 使静态链接成为不可能。
我不知道在iperf
修复它的最佳方法是什么。 目前我只能建议一个解决方法。
在运行configure
后静态构建iperf3
configure
替换
在src/Makefile
155-157 行的
iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(iperf3_CFLAGS) $(CFLAGS) \
$(iperf3_LDFLAGS) $(LDFLAGS) -o $@
和
iperf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) -all-static $(iperf3_CFLAGS) $(CFLAGS) \
$(iperf3_LDFLAGS) $(LDFLAGS) -o $@
即在$(CCLD)
之后直接插入-all-static
$(CCLD)
。
问题在于 libtool 将提供给编译器的-static
选项视为它自己的 MODE-ARG 并将其从编译器命令行中删除。
也许更好的解决方法是在运行configure
时设置LDFLAGS=--static
configure
。 注意额外的减号。
例如:
configure "LDFLAGS=--static" --disable-shared
这会构建一个静态可执行文件,但是会产生以下警告:
warning: Using 'getaddrinfo' in statically linked applications requires at runtime the
shared libraries from the glibc version used for linking
@d1mach :感谢您提供的信息和解决方法……这很有趣!
该解决方法对我在 CentOS 7 (x86_64) 上进行本地编译很有效。 我必须有一台安装了glibc-static
机器,但没有安装任何lksctp-*
东西。 此外,我没有使用 OpenSSL 构建(我使用的测试 VM 没有openssl-devel
)。
我不确定这将如何在交叉编译环境中工作... @doru91您认为这种解决方法可能对您有帮助吗?
我的解决方案很好。
非常感谢!
我可能需要为 FAQ 写这个……我敢打赌,你不是唯一想要/需要构建静态可执行文件的人。 乐观地保持这个问题开放以提醒我这样做。
在 835ec5f 中添加了 FAQ 条目,关闭。 谢谢大家的信息和讨论!
@d1mach非常感谢你。 我有一个大问题。 你的回答对我很有效。
@d1mach这是来自未来的感谢。 那个“--static”技巧是我在互联网上搜索修复的技巧,但并没有完全理解出了什么问题。 这解决了它,将来会派上用场。 非常感激。
最有用的评论
也许更好的解决方法是在运行
configure
时设置LDFLAGS=--static
configure
。 注意额外的减号。例如:
这会构建一个静态可执行文件,但是会产生以下警告: