Вы компилируете функцию кода на C, но ожидаете связать функцию C ++.
Из-за 'type safe linkage' предоставляемая вами функция не является той функцией, которую вызывает код C ++.
Либо в test1.h использовать:
#ifdef __cplusplus
extern "C" {
#endif
extern void test1(void);
#ifdef __cplusplus
}
#endif
Или:
- Скомпилируйте функцию с помощью компилятора C ++.
Компилятор C ++ будет манипулировать именами символов, чтобы обеспечить безопасную для типов связь (термин, который вы должны быть в состоянии искать через предпочитаемую вами поисковую систему).
'Компилятор' - фактически компоновщик - ищет функцию с искаженным именем C ++, представляющую функцию C ++ с подписью 'void test1 (void);'.
Например (но помните - разные компиляторы преднамеренно манипулируют вещами по-разному), G ++ 4.2.1 на MacOS X 10.6.2 генерирует символ '__Z5test1v
' для функции; GCC генерирует символ '_test1
'. Ясно, что когда компоновщик ищет «__Z5test1v
», символ «_test1
» не будет использоваться - он не пишется одинаково. Это хорошая вещь.
Вы можете использовать 'nm -g' в объектном файле для основной программы, чтобы увидеть, что она ищет, и в объектном файле в библиотеке, чтобы увидеть, что она предоставляет. И, учитывая, что написание отличается, поэтому загрузчик не выбирает библиотечную функцию - он ищет что-то с другим именем.