-
Notifications
You must be signed in to change notification settings - Fork 13.9k
Description
See my test repo: upsuper/rust-msvc-link-test
- Build the crate with
i686-pc-windows-msvctoolchain - Build the C++ file with
cl.exefrom MSVC 2015 - Link them together via
link.exefrom MSVC 2015
(The 32bit MSVC 2015 toolchain locates at "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64_x86" for me)
It shows linker error like:
test.lib(test.0.o) : error LNK2019: unresolved external symbol __imp__?after@nsCSSPseudoElements@@2PAVnsICSSPseudoElement@@A referenced in function _test
test.lib(test.0.o) : error LNK2019: unresolved external symbol _?before@nsCSSPseudoElements@@2PAVnsICSSPseudoElement@@A referenced in function _test
Using dumpbin -symbols to analyse main.obj and test.lib shows that, in main.obj, the symbols are
008 00000000 SECT3 notype External | ?after@nsCSSPseudoElements@@2PAVnsICSSPseudoElement@@A (public: static class nsICSSPseudoElement * nsCSSPseudoElements::after)
009 00000004 SECT3 notype External | ?before@nsCSSPseudoElements@@2PAVnsICSSPseudoElement@@A (public: static class nsICSSPseudoElement * nsCSSPseudoElements::before)
however, in test.lib generated by rustc, the import symbols are
02A 00000000 UNDEF notype External | __imp__?after@nsCSSPseudoElements@@2PAVnsICSSPseudoElement@@A
02D 00000000 UNDEF notype External | _?before@nsCSSPseudoElements@@2PAVnsICSSPseudoElement@@A
Thus the mismatch.
It's even more interesting that the symbol from nested crate is different from the crate of the lib, even though they are both extern symbols.
This issue doesn't show up for 64bit build with proper link_name. The corresponding symbols in rust staticlib with x86_64 toolchain would be:
A15B 00000000 UNDEF notype External | __imp_?after@nsCSSPseudoElements@@2PEAVnsICSSPseudoElement@@EA (__declspec(dllimport) public: static class nsICSSPseudoElement * nsCSSPseudoElements::after)
A15C 00000000 UNDEF notype External | __imp_?before@nsCSSPseudoElements@@2PEAVnsICSSPseudoElement@@EA (__declspec(dllimport) public: static class nsICSSPseudoElement * nsCSSPseudoElements::before)
It could either because of the different prefix (__imp_ vs. __imp__ and _) or the different link type? But the linker also complains about dllimport using on static link symbols for 64bit build.