使用 mingw-w64 在链接时创建带有未解析符号的动态库

问题描述 投票:0回答:1

我有一个文件

mylib.c
,其中包含以下内容:

extern void some_function(void);

int add(int a, int b) {
    some_function();
    return a+b;
} 

我想从中创建一个共享库。函数

some_function
应由共享库的使用者动态链接。因此,在构建共享库时,该符号仍未解析。

当我在 Ubuntu 上使用 gcc 时...

gcc mylib.c -o libmylib.so -shared

...构建成功。

但是,我还需要交叉构建 Windows 的库。我正在使用 mingw-w64 来实现此目的:

sudo apt install -y mingw-w64

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared

现在,我收到此错误:

/usr/bin/x86_64-w64-mingw32-ld: /tmp/ccWlwvfS.o:mylib.c:(.text+0xf): undefined reference to `some_function'
collect2: error: ld returned 1 exit status

经过一些研究,我尝试了各种选项来解决这个问题。以下是其中一些:

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,--no-undefined

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,-u,some_function

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,-u,_some_function

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,-U,some_function

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,-U,_some_function

x86_64-w64-mingw32-gcc mylib.c -o mylib.dll -shared -Wl,--unresolved-symbols=ignore-all

不幸的是,它们都不起作用。

如何配置链接器才能使其正常工作?或者是否有另一种解决方法可以从 Linux 主机获取带有链接时未定义符号的 DLL?

gcc shared-libraries linker-errors mingw-w64 undefined-symbol
1个回答
0
投票

使用 MinGW-w64 构建 Windows 共享库(DLL 文件)时,您应该使用 ether 链接指定用于列出要导出的符号的

.def
文件,或者在导出/导入函数上使用
__declspec(dllexport)
/
__declspec(dllimport)
(后者最常用)。

有关如何执行此操作的最小示例,请参阅: https://github.com/brechtsanders/ci-test

© www.soinside.com 2019 - 2024. All rights reserved.