Как разрешить внешние символы в dll во время выполнения, а не во время соединения с Cygwin - PullRequest
0 голосов
/ 28 апреля 2020

Я портирую набор программ с linux на Windows + Cygwin. Основная разделяемая библиотека набора относится к нескольким постоянным внешним символам, объявленным в программах, использующих разделяемую библиотеку. Я не нашел способ сделать то же самое с Cygwin. Жалобы на неразрешенные символы при создании общей библиотеки. Опция --allow-shlib-undefined не поддерживается в Windows + Cygwin?

Пример:

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

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Большое спасибо за этот обходной путь. Я попытаюсь расширить его до моего реального случая: DLL, состоящая из множества объектных файлов и множества программ, связанных с DLL. Насколько я понимаю, может быть необходимо создать DLL для каждой программы.

0 голосов
/ 01 мая 2020

Не так просто, как циклическая зависимость - беспорядок в Windows

https://www.lurklurk.org/linkers/linkers.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
...