(Это 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?
Ссылка находится в общей библиотеке:
$ 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