(Это 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