Arch Linux下编译highs-sys时出现undefined reference链接错误求助
Arch Linux下编译highs-sys时出现undefined reference链接错误求助
我目前在Arch Linux x86_64环境下,使用Rust 1.66.0稳定版、g++ 12.2.0,遇到了highs-sys crate的链接问题——这个问题是通过good-lp间接依赖引入的,而且即使脱离我自己的代码单独测试highs-sys也会出现。
我试过最新的master分支(commit c785240)、v1.2.2版本,以及之前用了好几个月都没问题的v0.2.1版本,结果都一样。所以这应该不是highs-sys的新版本问题,大概率是我的工具链出了问题。
我的工具链版本信息如下:
$ cargo --version cargo 1.66.0 (d65d197ad 2022-11-15) $ rustc --version rustc 1.66.0 (69f9c33d7 2022-12-12) $ cc --version cc (GCC) 12.2.0 $ ld --version GNU ld (GNU Binutils) 2.39.0
复现步骤
我克隆并构建highs-sys的过程是这样的:
$ git clone --recursive https://github.com/rust-or/highs-sys $ cd highs-sys $ cargo build
构建成功,输出:
Finished dev [unoptimized + debuginfo] target(s) in 3m 35s
接着运行单元测试也没问题:
$ cargo test --lib
测试结果:
Finished test [unoptimized + debuginfo] target(s) in 0.04s Running unittests src/lib.rs (target/debug/deps/highs_sys-96b0b941fcc31775) running 2 tests test bindgen_test_layout___fsid_t ... ok test bindgen_test_layout_imaxdiv_t ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
但运行集成测试的时候就出问题了:
$ cargo test --test test_highs_call
编译时出现链接错误,核心错误信息是:
error: linking with `cc` failed: exit status: 1 ... /usr/bin/ld: /tmp/highs-sys/target/debug/deps/test_highs_call-e669101ae4108d78.5gi5ablibidmtrpd.rcgu.o: in function `test_highs_call::highs_call': /tmp/highs-sys/tests/test_highs_call.rs:88: undefined reference to `Highs_lpCall' collect2: error: ld returned 1 exit status
另一个集成测试test_highs_functions也会出现类似的所有Highs_*函数未定义的错误。
排查细节
我用nm命令检查了相关文件:
- 在测试目标文件里,符号是未定义的:
$ nm target/debug/deps/test_highs_call-e669101ae4108d78.5gi5ablibidmtrpd.rcgu.o | grep Highs_lpCall U Highs_lpCall - 在
highs-sys的静态库中,符号是已定义的,但所有符号的地址都是00000000,这看起来有点奇怪:$ nm /tmp/highs-sys/target/debug/deps/libhighs_sys-addd17046a23d2a8.rlib | grep Highs_lpCall nm: lib.rmeta: no symbols 00000000 T Highs_lpCall
尝试过的解决方案
- 切换到gcc11:设置
CC=/usr/bin/gcc-11、CXX=/usr/bin/g++-11、RUSTFLAGS="-C linker=/usr/bin/gcc-11",但还是出现同样的未定义引用错误。 - 切换到clang:设置
CC=/usr/bin/clang、CXX=/usr/bin/clang++、RUSTFLAGS="-C link-arg=-fuse-ld=lld",此时链接成功,测试全部通过,但这只是临时 workaround,不是根本解决办法。
其他调用C API的Rust库在我的环境下都能正常工作,所以实在搞不清问题出在哪,有没有大佬能给点建议?
备注:内容来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

