x86下LNK2019错误
bstaint opened this issue · 13 comments
Line 18 in 6f360aa
extern "system" -- Usually the same as extern "C", except on Win32, in which case it's "stdcall", or what you should use to link to the Windows API itself
参考:
https://doc.rust-lang.org/reference/items/external-blocks.html#abi
extern "system"
是没错的,因为win下我就是用的stdcall
方式。至于无法链接,我只提供了64位的liblcl.dll
和liblcl.lib
,32位的dll可以在govcl项目中下载,32位的liblcl.lib可以用apptest
目录下的genlib.bat
生成。
我是用的32位的dll生成的lib,但是就是会报大量的LINK2019
'librust_vcl-6bfd44d4010f45cf.rlib(rust_vcl-6bfd44d4010f45cf.rust_vcl.c67hlxnr-cgu.15.rcgu.o) : error LNK2019: 无法解析
的外部符号 __imp__Printer_Instance@0,该符号在函数 __ZN4core3ops8function6FnOnce9call_once17h10386a96de90124fE 中被引用\
r\n'
我是用msvc生成的lib.
这个问题的原因我找了下,是因为x86下__stdcall
修饰名的问题, 因为liblcl.dll不是vc生成的,用vc的lib.exe生成的lib不符合__stdcall修饰名。。。 是个很蛋疼的问题。。。
应该不是这个问题吧,我尝试用C++调用liblcl是可以正常执行的。
我测试了,是这个问题来着。修正 修饰名 编译正常。至于c++调用你要用的liblcl.h的话那个是动态调用的,不存在修饰名问题。
感谢帮助,我写了个脚本处理了下def文件可以了。
我用masm的工具生成了lib,测试了可以的,不知道你用的哪种方式
还是有问题,编译过了 运行导入表又不一致。
cargo rustc --target=i686-pc-windows-msvc -- -C link-args="/SAFESEH:NO"
这是我用masm工具链生成的32位的liblcl.lib
可以了 ,感谢。
我又测试了下,可以正常编译,但是跑不起来:
#![windows_subsystem = "windows"]
#![allow(non_snake_case)]
#![allow(dead_code)]
// #[cfg(target_os = "windows")]
use rust_vcl::fns::*;
use rust_vcl::types::*;
use rust_vcl::vcl::*;
fn main() {
Application.SetMainFormOnTaskBar(true);
let form = Application.CreateForm();
form.SetCaption("你好,Rust! - Hello Rust!");
Application.Run();
}
我测试是可以跑起来的,原来的例子因为要加载一个ico文件,govcl中的dll有点不一样,所以不会的错误提示,新的dll和命令行编译我都放仓库里面了,你可以pull下,里面有win32和win64的dll和lib,
谢谢,试了可以跑起来了,原来我代码有点问题。