Rust кросс-компилировать -lpcap из macos в linux - PullRequest
3 голосов
/ 29 сентября 2019

Я пытаюсь выполнить кросс-компиляцию моего проекта Rust в Mac OS для Linux, используя cargo build --target=x86_64-unknown-linux-musl.

  • Я установил двоичный файл для Linux + musl кросс-компиляцию на Mac, используя brew install FiloSottile/musl-cross/musl-cross какВ идеале я бы хотел автономный бинарный файл.
  • Я также установил цель, используя rustup target add x86_64-unknown-linux-gnu
  • И у меня в моем .cargo/config есть следующее:
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

Однако я столкнулся с проблемами с 2 библиотеками - sqlite3 и pcap:

  = note: /usr/local/Cellar/musl-cross/0.9.8/libexec/bin/../lib/gcc/x86_64-linux-musl/6.4.0/../../../../x86_64-linux-musl/bin/ld: cannot find -lsqlite3
          /usr/local/Cellar/musl-cross/0.9.8/libexec/bin/../lib/gcc/x86_64-linux-musl/6.4.0/../../../../x86_64-linux-musl/bin/ld: cannot find -lpcap
          collect2: error: ld returned 1 exit status

Мне удалось решить проблему компоновщика sqlite3, добавив features = ["bundled"] в мой файл Cargo.toml (аналогично тому, чтоописанный здесь - https://users.rust -lang.org / t / linker-неспособен найти-lsqlite3 / 23230/18 ), так как это, вероятно, построило его из источника (что было здорово), но когда я попытался сделать то же самоес pcap он выдал следующую ошибку:

the package `myProject` depends on `pcap`, with features: `bundled` but `pcap` does not have these features.

После прочтения где-то я также попытался (с небольшими надеждами) указать путь к установленному libpcap на mac, используя RUSTPATH='-L/...' cargo build ..., но это, конечно, привело кнеопределенные ошибки символов.

Любые идеи, как я могу обойти эту проблемуи кросс-компилировать мой проект Rust в статически связанный бинарный файл на macos для запуска на linux?

1 Ответ

0 голосов
/ 29 сентября 2019

Кросс-компиляция волшебным образом не заботится о библиотеках.Вы не можете просто сказать «Я хочу musl», и что-то позаботится обо всех ваших зависимостях.

Сообщение об ошибке, которое вы видите, говорит именно об этом: оно не может найти libsqlite3 и libpcap.

Причина, по которой ошибка sqlite исчезает, заключается в том, что в вашей библиотеке sqlite есть функция bundled, которая заменяет связывание встроенным клиентом sqlite.Это, однако, также запрашивает функцию pcap bundled, которая не существует.

У вас есть два варианта:

  • Если вы не возражаете против потери производительности вклиент sqlite в комплекте, измените определение своей функции, чтобы указать на функцию зависимости, требующую sqlite
  • Если вы хотите использовать саму необработанную библиотеку, вам придется скомпилировать ее для musl

Независимо от того, что произойдет, вам нужно будет кросс-компилировать libpcap для musl с sysroot по умолчанию, предоставленным вашим musl компилятором.Поскольку это зависит от библиотеки, вам необходимо обратиться к документации по libpcap.как только вы это сделаете, вы сможете использовать флаг -lpcap, и ошибка разрешится сама собой.

...