У меня проблема со связью между двумя библиотеками libA.a (статическая) и libB.so (динамическая), созданная из исходников C.
В одном из исходных файлов, использованных для генерации libB.so,У меня есть следующие функции:
static uint64_t unassigned_mem_read(void *opaque, hwaddr addr, unsigned size) { ... }
static void unassigned_mem_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { ... }
Когда я запускаю nm libB.so | grep unassigned_mem
, у меня есть:
00000000004662a7 t unassigned_mem_read
0000000000466337 t unassigned_mem_write
И в исходном файле, используемом для создания libA.a, я имеюgot:
extern uint64_t unassigned_mem_read(void *opaque, hwaddr addr, unsigned size);
extern void unassigned_mem_write(void *opaque, hwaddr addr, uint64_t val, unsigned size);
и чуть дальше эти методы вызываются.
Когда я компилирую, все в порядке.Но тогда по ссылке у меня есть:
[build] qmg-mmio.c:47: undefined reference to 'unassigned_mem_read'
[build] qmg-mmio.c:84: undefined reference to 'unassigned_mem_write'
Когда я делаю nm libA.a | grep unassigned_mem
У меня есть:
U unassigned_mem_read
U unassigned_mem_write
Я связываю в следующем порядке: libB.so, libA.a.
Поскольку символы одинаковы, что может сделать их неразрешимыми?
Более того, когда я собираю все исходники вместе, у меня не возникает проблем с ссылками.Есть ли какая-то хитрость при объединении статической и динамической библиотек, которые мне не хватает?