Неопределенная ссылка при динамическом связывании с gcc в cygwin

(Это gcc 3.3.1 (длинная история - винить NIST ) на Cygwin.)

Я скомпилировал несколько исходных файлов с помощью gcc -c -fPIC ... , чтобы получить файлы .o.

Тогда я сделал:

$ gcc -shared -o foo.dll foo.o bar.o

Но когда я собираюсь использовать его:

$ gcc -o usefoo.exe usefoo.o -L. -lfoo
  usefoo.o:usefoo.cpp:(.text+0x2e0): undefined reference to `_get_template_size'
  collect2: ld returned 1 exit status

Однако, если использует те же файлы .o , я вместо этого использую:

$ ar rcs libfoo-static.a foo.o bar.o

Ссылка на это успешна:

$ gcc -o foo.exe foo.o -L. -lfoo-static

Что для меня странно, так это то, что, как вы можете видеть ниже, указанная ссылка присутствует как в .a, так и .dll. Так почему же возникает ошибка при компоновке с .dll?

Ссылка находится в разделяемой библиотеке:

$ nm foo.dll|grep get_template
1001b262 T _get_template_size

И также в статической библиотеке:

$ nm libfoo-static.a |grep get_template
00000352 T _get_template_size

А вот ссылка на символ, сгенерированный в файле, который хочет используйте функцию:

$ nm usefoo.o
00000000 b .bss
00000000 d .data
00000000 t .text
0000012c T __Z12ErrorMessagei
         U ___main
         U __alloca
         U _atoi
         U _get_template_size
0000026c T _main
         U _printf

Обновлено с учетом ответа Марко

Интересно / досадно, когда я пытаюсь сделать минимальный тестовый пример этого, я не могу этого добиться (хотя это происходит каждый раз с реальной вещью):

func1.h :

#ifndef FUNC1_H
#define FUNC1_H

int func1(int i);

#endif

func1.c :

#include "func1.h"

int func1(int i) {
  return 2*i;
}

usefunc.c :

#include <stdio.h>
#include "func1.h"

int main() {
  printf("%d\n", func1(10));
}

Затем:

$ rm *.o *.dll *.a

$ gcc -fPIC -I. -c func1.c usefunc.c

$ gcc -shared -o func.dll func1.o

$ gcc -L. -o usefunc.exe usefunc.o -lfunc

$ ./usefunc.exe
20
5
задан QuantumMechanic 17 February 2012 в 16:59
поделиться