неразрешенные символы в статической библиотеке, скомпилированной с помощью gcc - PullRequest
1 голос
/ 03 августа 2011

Я пытаюсь скомпилировать некоторый устаревший код C / C ++ в Mac OS X с помощью gcc 4.2.это было первоначально написано на Windows, используя Visual Studio.Я собираю статическую библиотеку, с которой связан другой код, но я столкнулся с некоторыми трудными для понимания ошибками компоновщика.

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

Undefined symbols for architecture i386:
  "_read_float", referenced from:
      _sub_token_values in libcompengine.a(alparce.o)

Метод read_float находится в библиотеке, и он компилируется.Но когда я сбрасываю символы в библиотеке, используя nm, я вижу, что в libcompengine.a (alparce.o) метод _read_float выглядит как неопределенный:

U _read_float 

И далее в файле, где предполагается read_floatчтобы быть определенным, он появляется с искаженным именем:

00000686 t __ZL10read_floatPKj

Может кто-нибудь дать мне какие-либо подсказки относительно того, почему этот метод не решается правильно?Я потратил полдня, пробуя различные флаги компилятора и исходных текстов gcc, но, к сожалению, я еще не выбрал выигрышную комбинацию.

1 Ответ

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

Если вы планируете использовать библиотеку C ++ для взаимодействия с C, важно отметить, что функции, которые будут вызывать программы на C, помечены соответствующим образом.

Я сделал следующее (хотя есть и другие способы сделать это)

#ifndef INCLUDE_FILE_NAME_H
#define INCLUDE_FILE_NAME_H

// Insert this before any global function defintitions
#ifdef __cplusplus
extern "C" {
#endif

float read_float();

// Insert after all global function defintions
#ifdef __cplusplus
}
#endif
#endif

Что он делает, так это говорит компилятору, что все определения внешних функций между внешними строками "C" {} должны использовать связь C. Он добавляет дополнительное определение только при компиляции с C ++. Другой вариант - сделать что-то похожее на приведенное ниже, которое в основном позволяет вам указывать функцию за функцией, которая должна использовать связь C, а какая нет.

#ifdef __cplusplus
#define C_LINKAGE "C"
#else
#define C_LINKAGE
#endif

extern C_LINKAGE float read_float();
...