Skip to content

Link libwebrtc-sys against debug libwebrtc build #12

@alexlapa

Description

@alexlapa

В данный момент libwebrtc-sys всегда линкуется с релизным билдом libwebrtc:

    // TODO: rustc always links against non-debug Windows runtime, so we always
    //       use release build of libwebrtc.
    //       https://github.com/rust-lang/rust/issues/39016
    println!(
        "cargo:rustc-link-search=native=crates/libwebrtc-sys/lib/release/"
    );

Причина там тоже указана, но есть подозрения что это все-таки возможно.

Сначала присобачим debug build:

println!( "cargo:rustc-link-search=native=crates/libwebrtc-sys/lib/debug/");

Начнет ругаться что хочет msvctrd:

          webrtc.lib(arg.obj) : error LNK2001: unresolved external symbol __imp__calloc_dbg
          webrtc.lib(time_zone_format.obj) : error LNK2001: unresolved external symbol __imp__calloc_dbg
          webrtc.lib(civil_time_detail.obj) : error LNK2001: unresolved external symbol __imp__calloc_dbg
          webrtc.lib(cord.obj) : error LNK2001: unresolved external symbol __imp__calloc_dbg
          webrtc.lib(int128.obj) : error LNK2001: unresolved external symbol __imp__calloc_dbg
          webrtc.lib(audio_device_core_win.obj) : error LNK2001: unresolved external symbol __imp__calloc_dbg
          webrtc.lib(parser.obj) : error LNK2001: unresolved external symbol __imp__calloc_dbg
          webrtc.lib(bind.obj) : error LNK2001: unresolved external symbol __imp__calloc_dbg

Что логично, так как раст подкидывает только msvcrt. Подкинем msvcrtd:

println!( "cargo:rustc-link-libe=dylib=msvcrtd");

После этого будет ругаться вот так:

libcxx-76ca93e71f442ad3.rlib(cxx.o) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MDd_DynamicDebu
g' in webrtc.lib(stun_prober.obj)

Это лечиться прокидыванием -MDd в флажки компилятора, например, вот таким вот образом:

./cargo/config:

[env]
CXXFLAGS = "-MDd"
CFLAGS = "-MDd"

Также, можно заметить, что при линковке сейчас прокидывается msvcrtd.lib, который мы прокидываем вручную, плюс раст еще сверху докидывается msvcrt.lib. Это никак не ошибит, но есть подозрения, что прокидывать два CRT не самая лучшая идея. Это лечится таким образом:
./cargo/config:

[build]
rustflags = ["-C", "link-args=/NODEFAULTLIB:msvcrt.lib"]

Теперь наблюдаем вот такую вот ошибку:

libcxx-76ca93e71f442ad3.rlib(cxx.o) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0' in webrtc.lib(stun_prober.obj)

Судя по всему, нужно прокидывать _ITERATOR_DEBUG_LEVEL=2 при компиляции libwebrtc. Дальше не ковырял.

Metadata

Metadata

Assignees

Labels

enhancementImprovement of existing features or bugfixk::toolchainApplies to changes of project toolchainplatform::windowsSpecific to Windows platform

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions