Dll 链接到使用MSVC编译的静态库

Dll 链接到使用MSVC编译的静态库,dll,rust,Dll,Rust,我正在尝试在windows上链接一个简单的C库来防止生锈 我的lib是.h extern "C" { void say_hello(const char* s); } .cpp 链接失败,因为其中一个数据符号出现错误 error: linking with `gcc` failed: exit code: 1 note: "gcc" "-Wl,--enable-long-section-names" "-fno-use-linker-plugin" "-Wl,--nxcompat" "

我正在尝试在windows上链接一个简单的C库来防止生锈

我的lib是.h

extern "C" {
    void say_hello(const char* s);
}
.cpp

链接失败,因为其中一个数据符号出现错误

error: linking with `gcc` failed: exit code: 1
note: "gcc" "-Wl,--enable-long-section-names" "-fno-use-linker-plugin" "-Wl,--nxcompat" "-Wl,--large-address-aware" "-shared-libgcc" "-L" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib" "e:\Rust\DBTools\DBAnalytics\target\debug\DBAnalytics.o" "-o" "e:\Rust\DBTools\DBAnalytics\target\debug\DBAnalytics.dll" "e:\Rust\DBTools\DBAnalytics\target\debug\DBAnalytics.metadata.o" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\libstd-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\libcollections-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\librustc_unicode-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\librand-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\liballoc-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\liblibc-11582ce5.rlib" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib\libcore-11582ce5.rlib" "-L" "e:\Rust\DBTools\DBAnalytics\target\debug" "-L" "e:\Rust\DBTools\DBAnalytics\target\debug\deps" "-L" "C:\Program Files (x86)\Rust 1.2\bin\rustlib\i686-pc-windows-gnu\lib" "-L" "e:\Rust\DBTools\DBAnalytics\.rust\bin\i686-pc-windows-gnu" "-L" "e:\Rust\DBTools\DBAnalytics\bin\i686-pc-windows-gnu" "-Wl,-Bstatic" "-Wl,--whole-archive" "-l" "CDbax" "-Wl,--no-whole-archive" "-Wl,-Bdynamic" "-l" "ws2_32" "-l" "userenv" "-l" "advapi32" "-shared" "-l" "compiler-rt"
note: Warning: corrupt .drectve at end of def file
Cannot export ??_C@_0M@LACCCNMM@hello?5world?$AA@: symbol not found
该库以MSVC2013为基础构建,作为一个简单的静态库。字符串“hello world”位于数据部分,因此我不希望它导致链接错误。在windows上链接C库时,是否需要注意某些特定设置


顺便说一句,它是32位MSVC库。

好的,有几件事。首先,没有所谓的“静态DLL”:DLL是一个动态链接的库

其次,Rust使用MinGW工具链和运行时。混合使用MSVC和MinGW运行时可能会导致奇怪的事情发生,所以如果可能的话,最好避免使用。Rust最近才获得了对使用MSVC运行时构建的早期支持

然而,您可以让这个特定的示例工作,显然没有任何不良影响。您只需要更改一些内容:

  • 您需要使用动态库;我的理解是,这会减少不良互动的可能性

  • 实际上,您需要使用
    C
    链接来编译
    say_hello
    ,而不是
    C++
    链接。您在头文件中执行了此操作,但没有在源文件中执行

  • 您需要从库中公开导出
    say_hello

因此:

hello.rs

#[link(name="hello", kind="dylib")]
extern {
    fn say_hello();
}

fn main() {
    unsafe { say_hello(); }
}
hello.h

#ifndef HELLO_H
#define HELLO_H

extern "C" {
    __declspec(dllexport) void say_hello();
}

#endif
hello.cpp

#include <cstdio>

#include "hello.h"

void say_hello() {
    printf("hello world\n");
}

在我的机器上,这会生成
hello.exe
hello.dll
;运行时,
hello.exe
打印出
hello world

如果您尝试使用GCC构建dll会怎么样?rust几天前获得了msvc支持,但我认为没有任何msvc夜生活,而且我不知道这种支持能走多远。您可以通过使用
--target x86\u 64-pc-windows-msvc
调用
/configure
,尝试构建自己的mvsc rustc,让我们知道它是如何运行的!相关PR:我指的是静态库,不是dll。可悲的是,我们的“公司”库都是用MSVC编写的,所以我实在无法更改它们。我会给上面的一个例子go@Ronnie,如果您指的是静态库而不是DLL,您可能应该更新您的问题以反映这一点。目前,它多次声明它是一个动态链接库。工作非常完美。谢谢你,你是我的英雄。搜索工作意味着需要像FFI、libloaderapi或winapi这样的库,但还没有一个完整的代码示例。根据您的答案,使用Rust中的windows.dll变得微不足道,并且在core中得到支持。
#ifndef HELLO_H
#define HELLO_H

extern "C" {
    __declspec(dllexport) void say_hello();
}

#endif
#include <cstdio>

#include "hello.h"

void say_hello() {
    printf("hello world\n");
}
cl /LD hello.cpp
rustc -L. hello.rs