Связывание библиотек C с C ++ - PullRequest
3 голосов
/ 18 апреля 2011

Я создал файл DLL.Этот файл скомпилирован как C-код.Я хочу использовать этот файл DLL в новом проекте.Этот новый проект является проектом C ++.Если я компилирую свой новый проект, все в порядке, но когда проект компилируется как программа на C ++, это дает неразрешенную ошибку внешнего символа для функций, экспортируемых из файла dll.Я хочу, чтобы мой новый проект был программой на C ++, но я хочу связать библиотеку, скомпилированную как программу на Си.Я использую Visual Studio 2010. Любая помощь?

Ответы [ 3 ]

9 голосов
/ 18 апреля 2011

Другой подход - изменить заголовочный файл C, чтобы проверить, компилируется ли он компилятором cpp, и условно включить extern "C":

#ifdef __cplusplus 
extern "C" {
#endif

void func1(int a, int b);
//... other functions

#ifdef __cplusplus
}
#endif
7 голосов
/ 18 апреля 2011

Вам необходимо использовать extern "C" в заголовочных файлах объявлений импортированных процедур, чтобы использовать связь C.

В настоящий момент происходит то, что компилятор C ++ ожидает искаженных имен для ваших импортированных функций. Использование extern "C" отключает искажение имени в C ++.

Например:

extern "C"
{
    int Func1(int a, int b);
    void Func2(double a);
}

Поскольку у вас есть контроль над заголовочным файлом, имеет смысл поместить extern "C" в заголовочный файл. Это означает, что любому, кто использует ваш заголовочный файл, не нужно беспокоиться о таких проблемах. Однако, если вы включаете заголовочные файлы, над которыми у вас нет контроля, то предложение @ Nawaz - отличный способ сделать это.

Я также забыл упомянуть тот замечательный момент, который делает @bcsanches: extern "C" - это C ++, а не C. Таким образом, его необходимо включить условно, если вы хотите, чтобы один заголовочный файл работал как для C, так и для C ++.

5 голосов
/ 18 апреля 2011

Делайте это при добавлении заголовка C в проект C ++:

extern "C"
{
   #include "cheader.h" //C header 
}

Это предотвращает выполнение компилятором C ++ искажения имен для имен, определенных в cheader.h

Вы даже можете определить пространство имен как:

namespace cproject
{
    extern "C"
    {
       #include "cheader.h" //C header 
    }    
}

Если вы это сделаете, то вам нужно будет квалифицировать каждое имя (функции, переменные, структуры) с помощью cproject::, когда вы ссылаетесь на имена, определенные в cheader.h.

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