Rust 交叉编译踩坑

发布于 10 天前  95 次阅读


急眼了,写一篇

  事情的起因是这样的,我在我的 Windows 平台上写了一个 Rust 项目,然后我需要把他部署到一个 linux 服务器上,这看上去是一件很稀松平常的事情,于是我先去搜索了 Rust 的交叉编译方法,官方文档里写的很清楚:

$ rustup target add arm-linux-androideabi
info: downloading component 'rust-std' for 'arm-linux-androideabi'
info: installing component 'rust-std' for 'arm-linux-androideabi'

看上去简单的一,先给 rustup 添加一个 target 然后编译的时候指定 target 就行了,于是我去我的 linux 平台跑一个

$ rustup target list | grep "installed"
x86_64-unknown-linux-gnu (installed)

好,现在知道我的 target 是什么了,接下来只需要去执行以下 rustup target add x86_64-unknown-linux-gnu 然后 cargo build --target x86_64-unknown-linux-gnu --release 就完事了,然而调用这个命令的时候出了一个巨长无比的错误,核心思想是这样的:

  Could not find openssl via pkg-config:
  pkg-config has not been configured to support cross-compilation.

  Install a sysroot for the target platform and configure it via
  PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_PATH, or install a
  cross-compiling wrapper for pkg-config and set it via
  PKG_CONFIG environment variable.

  cargo:warning=Could not find directory of OpenSSL installation, and this `-sys` crate cannot proceed without this knowledge. If OpenSSL is installed and this crate had trouble finding it,  you can set the `OPENSSL_DIR` environment variable for the compilation process. See stderr section below for further information.

这就很几把扯淡了,意思是我需要安装 opensslpkg-config,问题这俩在 Windows 上肯定是装不了的,没办法,那试试 WSL 吧,我在 WSL 上确认了 opensslpkg-config 都安装好了,然后重复上面的步骤,ok,编译好了,给我乐的,马上上传到我自己的 ubuntu 服务器上写了个服务准备跑起来。
然后我就释然了,沟槽的 WSL 编译的 glibc 和 ubuntu 编译的 glibc 版本不一样。踏马的服务器上要 glibc 2.32,然后鬼知道 WSL 编译时候用的哪个版本的 glibc,行吧,那我再去找找怎么在编译的时候指定 glibc 版本,后来说实在不行自己在目标机上编译一份 glibc 吧,半个小时框框框编译完了,嘿,您才怎么着,不成,编译的时候没法他妈的指定 glibc 版本,要么他妈的换个 glibc 版本一致的 linux distro,要么就用 docker 去,问题我上哪重装 linux 去?docker 更是压根不想用,没办法,继续找,找到有人说可以用 musl 静态编译代替 glibc 动态链接,成,再试试。OK,又回来了,opensslpkg-config 找不到的错误又几把回来了,我就寻思这到底是怎么个JB事,musl 不行再试试 zigbuild 吧,一模一样的狗屎错误,我又仔细看了一眼错误日志,发现设置 OPENSSL_DIROPENSSL_LIB_DIR,和 OPENSSL_INCLUDE_DIR 这几个环境变量也成,可能是虽然装了 libssl-dev 但是环境变量没指定,ok,接下来去 dpkg 一下 libssl-dev 的安装位置,跑一下 dpkg -L libssl-dev,输出了巨长一串

/.
/usr
/usr/include
/usr/include/openssl
/usr/include/openssl/aes.h
/usr/include/openssl/asn1.h
/usr/include/openssl/asn1_mac.h
/usr/include/openssl/asn1err.h
/usr/include/openssl/asn1t.h
/usr/include/openssl/async.h
/usr/include/openssl/asyncerr.h
/usr/include/openssl/bio.h
/usr/include/openssl/bioerr.h
/usr/include/openssl/blowfish.h
/usr/include/openssl/bn.h
/usr/include/openssl/bnerr.h
/usr/include/openssl/buffer.h
/usr/include/openssl/buffererr.h
/usr/include/openssl/camellia.h
/usr/include/openssl/cast.h
/usr/include/openssl/cmac.h
/usr/include/openssl/cmp.h
/usr/include/openssl/cmp_util.h
/usr/include/openssl/cmperr.h
/usr/include/openssl/cms.h
/usr/include/openssl/cmserr.h
/usr/include/openssl/comp.h
/usr/include/openssl/comperr.h
/usr/include/openssl/conf.h
/usr/include/openssl/conf_api.h
/usr/include/openssl/conferr.h
/usr/include/openssl/conftypes.h
/usr/include/openssl/core.h
/usr/include/openssl/core_dispatch.h
/usr/include/openssl/core_names.h
/usr/include/openssl/core_object.h
/usr/include/openssl/crmf.h
/usr/include/openssl/crmferr.h
/usr/include/openssl/crypto.h
/usr/include/openssl/cryptoerr.h
/usr/include/openssl/cryptoerr_legacy.h
/usr/include/openssl/ct.h
/usr/include/openssl/cterr.h
/usr/include/openssl/decoder.h
/usr/include/openssl/decodererr.h
/usr/include/openssl/des.h
/usr/include/openssl/dh.h
/usr/include/openssl/dherr.h
/usr/include/openssl/dsa.h
/usr/include/openssl/dsaerr.h
/usr/include/openssl/dtls1.h
/usr/include/openssl/e_os2.h
/usr/include/openssl/ebcdic.h
/usr/include/openssl/ec.h
/usr/include/openssl/ecdh.h
/usr/include/openssl/ecdsa.h
/usr/include/openssl/ecerr.h
/usr/include/openssl/encoder.h
/usr/include/openssl/encodererr.h
/usr/include/openssl/engine.h
/usr/include/openssl/engineerr.h
/usr/include/openssl/err.h
/usr/include/openssl/ess.h
/usr/include/openssl/esserr.h
/usr/include/openssl/evp.h
/usr/include/openssl/evperr.h
/usr/include/openssl/fips_names.h
/usr/include/openssl/fipskey.h
/usr/include/openssl/hmac.h
/usr/include/openssl/http.h
/usr/include/openssl/httperr.h
/usr/include/openssl/idea.h
/usr/include/openssl/kdf.h
/usr/include/openssl/kdferr.h
/usr/include/openssl/lhash.h
/usr/include/openssl/macros.h
/usr/include/openssl/md2.h
/usr/include/openssl/md4.h
/usr/include/openssl/md5.h
/usr/include/openssl/mdc2.h
/usr/include/openssl/modes.h
/usr/include/openssl/obj_mac.h
/usr/include/openssl/objects.h
/usr/include/openssl/objectserr.h
/usr/include/openssl/ocsp.h
/usr/include/openssl/ocsperr.h
/usr/include/openssl/opensslv.h
/usr/include/openssl/ossl_typ.h
/usr/include/openssl/param_build.h
/usr/include/openssl/params.h
/usr/include/openssl/pem.h
/usr/include/openssl/pem2.h
/usr/include/openssl/pemerr.h
/usr/include/openssl/pkcs12.h
/usr/include/openssl/pkcs12err.h
/usr/include/openssl/pkcs7.h
/usr/include/openssl/pkcs7err.h
/usr/include/openssl/prov_ssl.h
/usr/include/openssl/proverr.h
/usr/include/openssl/provider.h
/usr/include/openssl/rand.h
/usr/include/openssl/randerr.h
/usr/include/openssl/rc2.h
/usr/include/openssl/rc4.h
/usr/include/openssl/rc5.h
/usr/include/openssl/ripemd.h
/usr/include/openssl/rsa.h
/usr/include/openssl/rsaerr.h
/usr/include/openssl/safestack.h
/usr/include/openssl/seed.h
/usr/include/openssl/self_test.h
/usr/include/openssl/sha.h
/usr/include/openssl/srp.h
/usr/include/openssl/srtp.h
/usr/include/openssl/ssl.h
/usr/include/openssl/ssl2.h
/usr/include/openssl/ssl3.h
/usr/include/openssl/sslerr.h
/usr/include/openssl/sslerr_legacy.h
/usr/include/openssl/stack.h
/usr/include/openssl/store.h
/usr/include/openssl/storeerr.h
/usr/include/openssl/symhacks.h
/usr/include/openssl/tls1.h
/usr/include/openssl/trace.h
/usr/include/openssl/ts.h
/usr/include/openssl/tserr.h
/usr/include/openssl/txt_db.h
/usr/include/openssl/types.h
/usr/include/openssl/ui.h
/usr/include/openssl/uierr.h
/usr/include/openssl/whrlpool.h
/usr/include/openssl/x509.h
/usr/include/openssl/x509_vfy.h
/usr/include/openssl/x509err.h
/usr/include/openssl/x509v3.h
/usr/include/openssl/x509v3err.h
/usr/include/x86_64-linux-gnu
/usr/include/x86_64-linux-gnu/openssl
/usr/include/x86_64-linux-gnu/openssl/configuration.h
/usr/include/x86_64-linux-gnu/openssl/opensslconf.h
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libcrypto.a
/usr/lib/x86_64-linux-gnu/libssl.a
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig/libcrypto.pc
/usr/lib/x86_64-linux-gnu/pkgconfig/libssl.pc
/usr/lib/x86_64-linux-gnu/pkgconfig/openssl.pc
/usr/share
/usr/share/doc
/usr/share/doc/libssl-dev
/usr/lib/x86_64-linux-gnu/libcrypto.so
/usr/lib/x86_64-linux-gnu/libssl.so
/usr/share/doc/libssl-dev/changelog.Debian.gz
/usr/share/doc/libssl-dev/changelog.gz
/usr/share/doc/libssl-dev/copyright

挺有意思,注意到在 /usr/lib/x86_64-linux-gnu 有一个 libssl.so,大胆猜测一下应该设置到这里,于是尝试设置 OPENSSL_DIR=/usr/lib/x86_64-linux-gnu,再跑一次编译,错误日志提示在 OPENSSL_DIR 下面找不到 include 文件夹,何意味?再看看输出,发现 include 文件夹就只有一个 /usr/include,那行吧,再设置 OPENSSL_DIR/usr/include,继续报错,这次错误日志又变了,提示

  cargo:warning=In file included from build/expando.c:1:
  cargo:warning=In file included from /usr/include/openssl/opensslv.h:109:
  cargo:warning=/usr/include/openssl/macros.h:14:10: fatal error: 'openssl/opensslconf.h' file not found
  cargo:warning=   14 | #include <openssl/opensslconf.h>
  cargo:warning=      |          ^~~~~~~~~~~~~~~~~~~~~~~
  cargo:warning=1 error generated.

合着找不到头文件,继续看上面 dpkg 的输出,发现 opensslconf.h/usr/include/x86_64-linux-gnu/openssl 下面

......

这他妈不对啊,合着这俩文件是分开的,你又要我在 openssl 文件夹里必须有一个 include 文件夹,然后又要求有一个 opensslconf.h 文件,问题这文件所在的 openssl 文件夹里没有 include 文件夹,有 include 文件夹的目录里没有 openssl/opensslconf.h 文件,我的心中和吃了屎一样难受,那现在几把怎么办?只有蒙,大力出奇迹 symlink 一下得了

cd /usr/include/openssl
sudo ln -s ../x86_64-linux-gnu/openssl/configuration.h
sudo ln -s ../x86_64-linux-gnu/openssl/opensslconf.h

/usr/include/x86_64-linux-gnu/openssl 下面的文件全部 symlink 到 /usr/include 下面,然后再试这编译一次,我草,居然行了,一人一句 symlink 牛逼来,真他妈编译过了就离谱,我正乐着呢,又几把报错了

  = note: error: unable to find dynamic system library 'pq' using strategy 'no_fallback'. searched paths:
            /tmp/rustcxB9ZPT/raw-dylibs/libpq.so
            /mnt/d/Projects/frederica-backend/target/x86_64-unknown-linux-gnu/debug/build/zstd-sys-1a7aabc5fc036d0f/out/libpq.so
            /usr/lib/x86_64-linux-gnu/libpq.so
            /usr/lib/x86_64-linux-gnu//libpq.so
            /home/dylech30th/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpq.so

还好这问题大爹我早遇到过了,本质上是和 libssl-dev 一样的问题,开发包和运行包不是同一个,所以我还得再去 apt install libpq-dev,装完之后这个问题就消失了,然后爆了一个巨长无比的 linker 错误

error: linking with `/home/dylech30th/.cache/cargo-zigbuild/0.19.8/zigcc-x86_64-unknown-linux-gnu.2.32-a726.sh` failed: exit status: 1
  |
  = note:  "/home/dylech30th/.cache/cargo-zigbuild/0.19.8/zigcc-x86_64-unknown-linux-gnu.2.32-a726.sh" "-m64" "/tmp/rustcpCTr79/symbols.o" "<257 object files omitted>" "-Wl,--as-needed" "-Wl,-Bstatic" "/mnt/d/Projects/frederica-backend/target/x86_64-unknown-linux-gnu/debug/deps/{libfutures-28d154dcf4417f9d.rlib,libfutures_executor-7afba41877da7d24.rlib,libenv_logger-0f342fc62e053652.rlib,libanstream-ed9255ada3c86e2e.rlib,libanstyle_query-cfb41ab8e4e18588.rlib,libis_terminal_polyfill-bb585aa3271b8f3b.rlib,libcolorchoice-6fc0ea92d9b11814.rlib,libanstyle_parse-29a81a16b35ffd3e.rlib,libutf8parse-74725c6e09e49c5b.rlib,libenv_filter-5fcc9abcfd305c99.rlib,libanstyle-19eec67bac9e098d.rlib,libhumantime-20c091a993b28278.rlib,libactix_cors-ed2bef01fe92880a.rlib,libactix_web_lab-205a20e0be64cf96.rlib,libserde_html_form-458f59eea684a542.rlib,libserde_path_to_error-e3529938f2ecf13e.rlib,libcsv-af94fa7da53d19a1.rlib,libcsv_core-36a775b8ffe0d467.rlib,libtokio_stream-d93e6cdc3a0a0c3d.rlib,libarc_swap-04b9e0e241faa2f1.rlib,libitertools-c62a2bba330c6f0f.rlib,librayon-1fa94b843f65454b.rlib,librayon_core-945d539473b0ebe5.rlib,libcrossbeam_deque-d3031ad376af31d0.rlib,libcrossbeam_epoch-1d6047a65fde79c1.rlib,libcrossbeam_utils-8d311c0411b41b60.rlib,libeither-f8ce232013b046e8.rlib,libdotenvy-ee87299280fbc5fd.rlib,libopenai-40f8ee9bc42795fc.rlib,libderive_builder-1d7303fbbce25113.rlib,libreqwest_eventsource-418678404d8c1635.rlib,libfutures_timer-72451361586a40a8.rlib,libeventsource_stream-55b6a2015740818f.rlib,libnom-3b980d2e6a245a33.rlib,libthiserror-6087a7caacad2188.rlib,libreqwest-f7116e5c16a70ee4.rlib,librustls_pemfile-6a273cf6618a1bc6.rlib,librustls_pki_types-38e6110c0f393cda.rlib,libipnet-497f3e06a1108483.rlib,libhyper_tls-75c1fbba90062675.rlib,libtokio_native_tls-0b979e811882bfdd.rlib,libmime_guess-44321fe1135443be.rlib,libunicase-0f8d564370bb92ce.rlib,libtower-18209f827463969d.rlib,libsync_wrapper-c689a8c1f665c4c9.rlib,libtower_layer-c2674b9da58a4d13.rlib,libnative_tls-39174f8310abbd7a.rlib,libopenssl_probe-8ef84cb165b0ef19.rlib,libopenssl-912d6f09ec6e85ac.rlib,libforeign_types-087fedfa4d20c1c9.rlib,libforeign_types_shared-6efe75ea064be7de.rlib,libopenssl_sys-a4b8cd594b862840.rlib,libhyper_util-484cdf3dbce83dde.rlib,libtower_service-322dd60aed3b1dea.rlib,libhyper-e738a3c263318afa.rlib,libwant-5b440e7d6088f80f.rlib,libtry_lock-34b02f6f3478429e.rlib,libhttp_body_util-cf8ea1df72e64977.rlib,libhttp_body-45d773453add52ba.rlib,libhttp-9dc288d78e14873a.rlib,libdiesel-cf5062fa1e2699c6.rlib,libpq_sys-84e99b69fc8e7af2.rlib,libchrono-4f82d3d4d7fe405a.rlib,libnum_traits-63dd1f13f8b5c3b0.rlib,libiana_time_zone-22cabdfb2a11fda0.rlib,libactix_session-e5c58bdf5eca194d.rlib,libanyhow-30592129842efc8f.rlib,libderive_more-5c4686c2aaf9c616.rlib,libactix_web-639ecdfddf900af9.rlib,libimpl_more-da3ed08da16e6c9b.rlib,libahash-7a59c16e05f8ed6a.rlib,liburl-4654215b5c6eb9fd.rlib,libidna-b14b7bb1a90550e0.rlib,libidna_adapter-8a7d2a624ab2f8c3.rlib,libicu_normalizer-04ec792676924b86.rlib,libicu_normalizer_data-0d90e535bedb5b17.rlib,libwrite16-db7f68fc5b72350a.rlib,libutf8_iter-ccfb3617fc4fa9f4.rlib,libutf16_iter-86733479d1733101.rlib,libicu_properties-6bc01a97ef6de707.rlib,libicu_properties_data-2d8ac5a423c19d2a.rlib,libicu_locid_transform-d4dd757ae144cc49.rlib,libicu_locid_transform_data-915cc8cb8bf7c395.rlib,libicu_collections-4b07ba87da47450f.rlib,libicu_provider-fa8d6ab14c3ee82d.rlib,libicu_locid-a3c903f868b30b4e.rlib,liblitemap-cccb2c2541472698.rlib,libtinystr-0720842c88ad91e3.rlib,libzerovec-8ee2beb5f8259ada.rlib,libwriteable-7e3bf3e3ae5c261b.rlib,libyoke-54dfcc9648ce4399.rlib,libzerofrom-cf4930045c2af940.rlib,libstable_deref_trait-8a76cab77ef9c922.rlib,libserde_urlencoded-2419948425a213c7.rlib,libform_urlencoded-908b20cfc525577b.rlib,libserde_json-a67c450216ffcebb.rlib,libryu-6b97a2af8b61c3aa.rlib,libactix_server-224f46475f3f558b.rlib,libactix_router-efe6dbe587c2fd98.rlib,libregex-baada6241b36f2a0.rlib,libregex_automata-1b4c5170ef354950.rlib,libaho_corasick-5060936f61189976.rlib,libregex_syntax-2c95a15ec4bf9be7.rlib,libserde-58998fc25b7ec277.rlib,libcookie-a3283456a5ecf68e.rlib,libhkdf-99783cb6c9e6ebed.rlib,libhmac-d29e0c9a474a5e48.rlib,libsha2-63ed8b3250d44dca.rlib,libtime-6ab592201f9b3509.rlib,libtime_core-926a686092f4ddf0.rlib,libnum_conv-4f02ec588889a7cd.rlib,libderanged-85ce092712131791.rlib,libpowerfmt-c1003d41801b8940.rlib,libaes_gcm-abcdcf16b5a8391d.rlib,libctr-78854c90719b9013.rlib,libghash-474b6e46aba177eb.rlib,libpolyval-b6c2d8df0d105a69.rlib,libopaque_debug-be73cc5f3e239007.rlib,libuniversal_hash-4062c9e6df99e290.rlib,libaes-8d954c81e282f039.rlib,libcipher-aaa71d49668fe95c.rlib,libinout-91ab31f48f675584.rlib,libaead-15d4c2a8a283ee50.rlib,libbase64-9596453e5d408d0d.rlib,librand-fb1eae64ed67690e.rlib,librand_chacha-336df4caa6f387f5.rlib,libactix_http-12bd4f8466d999c2.rlib,librand-fa0dd7b3140f3748.rlib,librand_chacha-fb35aca615b714c4.rlib,libppv_lite86-ac7a74c674f7665c.rlib,libzerocopy-b1450fec840c68df.rlib,libbyteorder-19d23b0c1f352eee.rlib,libzerocopy-932b1d057b6466de.rlib,librand_core-6e2937d5e0bfab56.rlib,libgetrandom-fc08723758f9be23.rlib,libhttparse-855df5f56dc698f1.rlib,libbrotli-f7261692615a72ce.rlib,libbrotli_decompressor-9a2fdb7d7bf4e19b.rlib,liballoc_stdlib-80b9089404efdf9e.rlib,liballoc_no_stdlib-e4d6bbb171ded188.rlib,libhttpdate-f364a73698e48e2f.rlib,libsha1-81bdfbb24aed0850.rlib,libcpufeatures-ece78655b26f4a05.rlib,libdigest-a6b4c631e853691d.rlib,libsubtle-30af2ac99eb21e63.rlib,libblock_buffer-a431b58371fdce6b.rlib,libcrypto_common-d285f07457f7cd19.rlib,libgeneric_array-413a674fd41188ca.rlib,libtypenum-70db351557104c52.rlib,librand_core-98af2d5f4edb37ad.rlib,libgetrandom-c363aec5b34ab3a2.rlib,libbase64-50bb4bd7752c9e50.rlib,liblocal_channel-2636115450af4df2.rlib,libbytestring-170fbbbd15a54a18.rlib,libencoding_rs-004ad421b322ee45.rlib,liblanguage_tags-a19f35e61c427022.rlib,libfoldhash-9cf1be45d6d20405.rlib,libmime-c3542cde661420ef.rlib,libpercent_encoding-5a27c142a4b5af60.rlib,libh2-e63266216982e3e6.rlib,libindexmap-6f4c4ec2b63b4fc8.rlib,libequivalent-8ed4c122ac6c3754.rlib,libhashbrown-3138d022f535c54d.rlib,libfutures_util-ff503660ed976e0d.rlib,libfutures_io-f7841a1d4b2c8784.rlib,libslab-046a8c499d9f672b.rlib,libfutures_channel-298679a65aa5d402.rlib,libfutures_task-1882f3776cdef32e.rlib,libpin_utils-3d9c084ce0305a4f.rlib,libzstd-ea92576b8634ab5f.rlib,libzstd_safe-2552d686dd48810a.rlib,libzstd_sys-01f74130c0e1533c.rlib,libflate2-53facf83b3168818.rlib,libminiz_oxide-b4bf5c84fe5c7f82.rlib,libadler2-953fe117f84d7ece.rlib,libcrc32fast-098a477913947e23.rlib,libactix_service-d140a2d464f8a1a4.rlib,libactix_codec-710d54ccde03656a.rlib,libtracing-a83c9a1a1f8b9409.rlib,libtracing_core-9f1f646e757746b1.rlib,libonce_cell-f0dab71049208f9e.rlib,libmemchr-7ec3bcdaedc57676.rlib,libbitflags-ff225e8bf7c36bb4.rlib,libtokio_util-15a6231dbfa60593.rlib,libfutures_sink-86dbd95a0a0a11d9.rlib,libderive_more-b886cc716046e66d.rlib,libactix_utils-dd761ede39dabe08.rlib,liblocal_waker-a92283d6afd83527.rlib,libactix_rt-c43b9b746cf118cc.rlib,libtokio-aebcbae84aa6f4d5.rlib,libsignal_hook_registry-69b9a637fdad229b.rlib,libsocket2-c9b4c3b1d30da451.rlib,libmio-0469516820ff45cc.rlib,liblog-f9cfc06303bbc794.rlib,libparking_lot-9b3ac4e065aa65cf.rlib,libparking_lot_core-241955c5acb0a916.rlib,liblibc-65ace88b122d3ed2.rlib,libcfg_if-f090c1b66e80a751.rlib,libsmallvec-d929178cf6e55e7d.rlib,liblock_api-e8c9adc9599db8b4.rlib,libscopeguard-e7374d89a87a1c19.rlib,libpin_project_lite-6be4057f176e8b62.rlib,libfutures_core-cadb133a0b7579af.rlib,libhttp-e8eb530446d168cf.rlib,libitoa-5e2bc39ac7c972db.rlib,libbytes-653b9fb69aa77a44.rlib,libfnv-30db6334de191cc9.rlib}.rlib" "<sysroot>/lib/rustlib/x86_64-unknown-linux-gnu/lib/{libstd-*,libpanic_unwind-*,libobject-*,libmemchr-*,libaddr2line-*,libgimli-*,librustc_demangle-*,libstd_detect-*,libhashbrown-*,librustc_std_workspace_alloc-*,libminiz_oxide-*,libadler2-*,libunwind-*,libcfg_if-*,liblibc-*,liballoc-*,librustc_std_workspace_core-*,libcore-*,libcompiler_builtins-*}.rlib" "-Wl,-Bdynamic" "-lssl" "-lcrypto" "-lpq" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-L" "/tmp/rustcpCTr79/raw-dylibs" "-B<sysroot>/lib/rustlib/x86_64-unknown-linux-gnu/bin/gcc-ld" "-fuse-ld=lld" "-Wl,-znostart-stop-gc" "-Wl,--eh-frame-hdr" "-Wl,-z,noexecstack" "-L" "/mnt/d/Projects/frederica-backend/target/x86_64-unknown-linux-gnu/debug/build/zstd-sys-a4a188e3287a6347/out" "-L" "/usr/lib/x86_64-linux-gnu" "-L" "/usr/lib/x86_64-linux-gnu/" "-L" "<sysroot>/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/mnt/d/Projects/frederica-backend/target/x86_64-unknown-linux-gnu/debug/deps/frederica_backend-728b5dfb69f05063" "-Wl,--gc-sections" "-pie" "-Wl,-z,relro,-z,now" "-nodefaultlibs"
  = note: some arguments are omitted. use `--verbose` to show all linker arguments
  = note: error: unsupported linker extension flag: -z nostart-stop-gc


warning: `frederica-backend` (bin "frederica-backend") generated 24 warnings
error: could not compile `frederica-backend` (bin "frederica-backend") due to 1 previous error; 24 warnings emitted

看得懂不?看不懂吧,我也看不懂,好在这问题 google 一下就有人发现一个星期前提到过,只需要设置一个 rust 编译的环境变量

export RUSTFLAGS="-Zlinker-features=-lld"

就 OK 了,看了一下,也没看明白 -lld 之后 rust 会用哪个 linker,但是总之是成了。

总结一下

总结一下,解决这个问题的流程,首先是不要走 Windows 交叉编译,去 WSL 编译,同时弄明白编译时候的 glibc 版本是什么,然后用 zigbuild 或者 musl 去编译,这俩一个是允许你设定 glibc 版本,一个是可以静态编译不走动态链接,接下来,他妈的他编译时候用的 openssl 的目录和环境变量完全是扯JB蛋,首先设置三个环境变量

OPENSSL_INCLUDE_DIR=/usr/include
OPENSSL_DIR=/usr/include
OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu/

OPENSSL_LIB_DIR 根据你发行版不同这个是可能会变的,记得去根据你的实际目录名去选择,接下来再设置一下 symlink,把 /usr/lib/x86_64-linux-gnu/openssl 下面的两个头文件软链接到 /usr/include 下面

cd /usr/include/openssl
sudo ln -s ../x86_64-linux-gnu/openssl/configuration.h
sudo ln -s ../x86_64-linux-gnu/openssl/opensslconf.h

最后,如果你用了类似 ORM 的框架,一定记得安装对应 ORM 框架的开发包,比如在这里要

apt install libpq-dev

然后接着切换 linker

export RUSTFLAGS="-Zlinker-features=-lld"

到了这个时候,再去调用 zigbuild 构建

cargo zigbuild --target x86_64-unknown-linux-gnu.2.32 --release

这里的 2.32 是你目标机需求的 glibc 版本,当然,如果你选择了 musl 就没必要这么做,详见这里的第一条回答

然后你就终于可以抱着吃了屎一样的心情运行起来了,珍爱生命,远离交叉编译