Вызов функций C из проекта C (совместно используемая библиотека) в том же решении Visual Studio, что и мой класс C ++, с ошибками компоновщика - PullRequest
0 голосов
/ 11 октября 2011

Я получаю ошибки связывания

ошибка LNK2028: неразрешенный токен (0A000018) "extern" C "void __clrcall MyCFunction (struct ud *)" (? MyCFunction @@ $$ J0YMXPAUud @@@ Z), на который ссылается функция "public: __clrcall MyCPPProj :: MyClass: : MyClass

ошибка LNK2019: неразрешенный внешний символ "extern" C "void __clrcall MyCFunction (struct ud *)" (? MyCFunction @@ $$ J0YMXPAUud @@@ Z), на который имеется ссылка в функции "public: __clrcall MyCPPProj :: MyClass :: MyClass

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

Вот как начинается заголовок моей библиотеки:

#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include "types.h"
extern void MyCFunction(struct myCStruct*);

Вот фрагмент из реализации заголовка:

extern void
MyCFunction(struct myCStruct* cStrInst)
{
    //Do stuff
}

и вот как я это называю:

#include "MyCLib.h"
MyClass::MyClass() {
    myCStruct myCObj;
    MyCFunction(&myCObj);
    //More to follow...
}

Кто-нибудь знает, где я иду не так? Весь совет, который я могу найти, кажется, уже реализован, то есть объявление всего заголовка с помощью extern "C" { wrapper (http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html).

EDIT Я попытался сделать библиотеку C более совместимой с C ++ и включил ее как C ++ и C с тем же результатом: ошибки компоновщика LNK2028 и LNK2019. Я сделал это статической библиотекой, потому что проекты должны иметь тип, и мне нужно было увидеть, как он компилируется отдельно перед добавлением его в мое решение.

Ответы [ 2 ]

0 голосов
/ 11 октября 2011

В качестве предварительного, хотя и правильного ответа, я обнаружил, что при добавлении формы к исходному проекту библиотеки C (в своем собственном решении - VS выдает предупреждение о преобразовании проекта, который я только что принял), и проверка всех файлов на C ++ (изменение суффикса и явное приведение) позволяет мне ссылаться и вызывать функцию, которая ранее нарушалась. Что еще за рефакторизация?

Так что я рад, что эта первая функция заработала. Вперед и вверх!

ОБНОВЛЕНИЕ Где-то вдоль линии я снова получал ошибки LNK2001 и LNK2019. На этот раз касается стороннего кода. Исправление оказалось на удивление простым (дублирующее объявление заменило #pragma один раз #include) и полностью не было обнаружено оригинальным компилятором.

Теперь все отлично работает вместе. Хотя у меня было альтернативное решение LGPL / BSD, если я не мог использовать свой оригинальный источник: D

0 голосов
/ 11 октября 2011

Для реализации (в .cpp-файле) вам нужно поставить extern "C" следующим образом:

extern "C" void MyCFunction(struct myCStruct* cStrInst)

, чтобы компилятор выдал правильное имя символа для C-like-ссылки.

...