Я пытаюсь скомпилировать следующие тестовые файлы для создания общей библиотеки:
answer.c
#include <stdio.h>
#include "add.h"
extern int myvar();
int answer()
{
printf("\r\n myvar:%d \r\n", myvar());
setSummand(20);
return add(22); // Will return 42 (=20+22)
}
add.c
#include <stdio.h>
int gSummand;
void setSummand(int summand)
{
printf("1Library is initialized\n");
gSummand = summand;
}
int add(int summand)
{
return gSummand + summand;
}
Я хочу создать общую библиотеку из 2-х файлов «answer.c» «add.c», я использую следующие команды:
gcc -c answer.c -o answer.o
gcc -c add.c -o add.o
gcc -shared add.o answer.o -o libtest.so
Однако третья команда выдает следующую ошибку:
answer.o:answer.c:(.text+0x9): undefined reference to `myvar'
answer.o:answer.c:(.text+0x9): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `myvar'
collect2: error: ld returned 1 exit status
Те же настройки успешно установятся, если я использую следующую команду для создания статической библиотеки вместо динамической. Поэтому я не вижу никакой ошибки, если я пытаюсь выполнить следующую команду:
ar rcs libtest.a add.o answer.o
Хотите знать, если я что-то здесь упускаю. Также хочу знать, как использовать внешние символы в общей библиотеке.