如何在运行时解析dll中的外部符号,而不是在Cygwin的链接时解析。

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

我正在将一套程序从linux移植到Windows+Cygwin。这套程序的主共享库指的是使用共享库的程序中声明的几个常量外部符号。我没有找到用Cygwin做同样事情的方法。 ld抱怨在构建共享库时未解析符号。在Windows+Cygwin上是否不支持--allow-shlib-undefined这个选项?

例如:

mydll.c

#include <stdio.h>

extern const int a;

void f(void)
{
  printf("%d\n", a);
}

myprog.c

const int a = 1;

extern void f(void);

int main(int argc, char** argv)
{
  f();
}

用来构建dll的命令。

 gcc -shared -o libmydll.so -Xlinker --allow-shlib-undefined mydll.c
c cygwin shared-libraries ld undefined-symbol
1个回答
0
投票

循环依赖关系在Windows下是个烂摊子,并不简单。

https:/www.lurklurk.orglinkerslinkers.html#wincircular

解决办法。

$ ar sqc  libmyprog.dll.a myprog.o
$ gcc --shared mydll.o -Wl,--out-implib=libmydll.dll.a -Wl,--export-all-symbols -o mydll.dll -L. -lmyprog
$ gcc myprog.o -Wl,--out-implib=libmyprog.dll.a -Wl,--export-all-symbols  -o myprog.exe -L. -lmydll
$ gcc --shared mydll.o -Wl,--out-implib=libmydll.dll.a -Wl,--export-all-symbols -o mydll.dll -L. -lmyprog
$ ./myprog.exe
1

验证它们是否相互依赖

$ objdump.exe -x mydll.dll  | grep "DLL Name"
        DLL Name: myprog.exe
        DLL Name: cygwin1.dll
        DLL Name: KERNEL32.dll

$ objdump.exe -x myprog.exe  | grep "DLL Name"
        DLL Name: mydll.dll
        DLL Name: cygwin1.dll
        DLL Name: KERNEL32.dll

0
投票

非常感谢你提供的这个变通方法。我将试着把它扩展到我的实际案例中:一个由许多对象文件和许多程序链接到dll组成的dll。据我所知,可能需要为每个程序创建一个dll。

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