gcc, статическая библиотека, функция внешней сборки становится неопределенным символом - PullRequest
3 голосов
/ 03 августа 2010

У меня проблема с g ++ созданием приложения, которое ссылается на статическую библиотеку, где последняя должна содержать некоторые глобальные функции, написанные во внешних asm-файлах, скомпилированных с yasm.Итак, в библиотеке у меня есть

#ifdef __cplusplus
extern "C" {
#endif

extern void __attribute__((cdecl)) interp1( char *pSrc );
extern void __attribute__((cdecl)) interp2( char *pSrc );

#ifdef __cplusplus
}
#endif

, на которую я ссылаюсь в другом месте внутри библиотеки.Затем есть реализация в asm-файле, например:

section .data
; (some data)
section .text
; (some text)

global _interp1
_interp1:
    ; (code ...)
    ret

global _interp2
_interp2:
    ; (code ...)
    ret

Компиляция и компоновка отлично работают для библиотеки, я делаю

yasm -f elf32 -O2 -o interp.o interp.asm

, а затем

ar -rc libInterp.a objs1.o [...] objsN.o interp.o 
ranlib libInterp.a

Теперь, наконец, чтобы связать библиотеку с основным приложением, я делаю

g++ -O4 -ffast-math -DNDEBUG -fomit-frame-pointer -DARCH_X86 -fPIC -o ../bin/interp this.o that.o -lboost_thread -lpthread ./libInterp.a 

и получаю ошибки

undefined reference to `interp1'
undefined reference to `interp2'

Что я здесь не так делаю?любая помощь приветствуется.

1 Ответ

2 голосов
/ 03 августа 2010

В зависимости от типа цели, gcc не будет добавлять начальное подчеркивание к внешним символам.Похоже, что так и есть в вашем сценарии.

Простое исправление, вероятно, заключается в удалении подчеркиваний из имен в файле сборки.

Возможно, вам понадобится использовать пару альтернатив, которые вы могли бы использовать.что-то вроде одного из следующих макросов для ваших символов в файле сборки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...