我正在将一套程序从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
循环依赖关系在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
非常感谢你提供的这个变通方法。我将试着把它扩展到我的实际案例中:一个由许多对象文件和许多程序链接到dll组成的dll。据我所知,可能需要为每个程序创建一个dll。