LNK2019: Неразрешенный внешний символ в C ++ / CLI - PullRequest
0 голосов
/ 18 октября 2019

У меня есть файл sample.c , в котором определена нестатическая функция

Источник: sample.c

#if defined(__cplusplus)
extern "C" {
#endif

int get_sample_value()
{
    return 1000;
}

#if defined(__cplusplus)
}
#endif

Есть чистый Проект C ++ SDK, sample_sdk , который в основном генерирует пару static-libs, где функция get_sample_value () используется в одном из исходных файлов следующим образом:

Источник: sample_sdk_source.cpp

extern int get_sample_value();

static void do_processing()
{
    int sample_value = get_sample_value();
    process( sample_value );
}

Вышеупомянутый sample.c будет скомпилирован в другом C ++ / CLI приложении с графическим интерфейсом, SampleViewer где sample_sdk libs включены в это приложение. Но при компиляции SampleViewer мы получаем следующую ошибку:

libsample-sdk-x86.lib (sample_sdk_source.obj): ошибка LNK2019: неразрешенный внешний символ «int __cdecl get_sample_value ()» (? Get_sample_value (? Get_sample_value)@@ YAPBUint @@ XZ) ссылка на функцию "public: static void __cdecl do_processing ()" (? Do_processing @@ SAXXZ)

Я также пытался использовать ту же функцию из SampleViewer :: main. файл cpp, но такая же ошибка существует. Есть ли проблема при доступе к функции, определенной в файле C как extern из среды C ++ / CLI?

1 Ответ

1 голос
/ 18 октября 2019

Ошибка компоновщика говорит сам за себя:

  • Ваша декларация extern int get_sample_value(); в C ++ устанавливает неопределенный символ для искаженного имени ?get_sample_value@@YAPBUint@@XZ
  • Ваше определение в sample.c определяет символ с не искаженным именем (_get_sample_value).

Чтобы решить эту проблему, либо пометьте объявление в C ++ с помощью extern "C", либо еще лучше: переместите объявление в заголовок, который могут включать и sample.c, и sample_sdk_source.cpp (с защитой #if defined(__cplusplus))

...