2011-03-13 8 views
4

C++ У меня есть статическую библиотеку функций, написанных на языке C. Допустим, файл заголовка называется myHeader.h и выглядит следующим образом:Referencing C функции в статической библиотеки из

#ifndef MYHEADER_H 
#define MYHEADER_H 

void function1(); 
void function2(); 

#endif 

function1 и function2 не что-нибудь слишком особенный. Допустим, они существуют в файл под названием impl1.c, который выглядит как:

#include "myHeader.h" 

void function1() { 
    // code 
} 
void function2() { 
    // more code 
} 

Всего код, указанный до сих пор компилируется в некоторую статическую библиотеку под названием libMyLib.a. Я бы предпочел не изменять какой-либо код, используемый для создания этой библиотеки. У меня также есть заголовок C++ (cppHeader.h), который выглядит следующим образом:

#ifndef CPPHEADER_H 
#define CPPHEADER_H 

class CppClass { 
    private: 
     double attr1; 
    public: 
     void function3(); 
}; 
#endif 

Тогда cppHeader.cpp выглядит следующим образом:

#include "cppHeader.h" 
#include "myHeader.h" 

// constructor 
CppClass::CppClass(){} 

void CppClass::function3() { 
    function1(); 
} 

Когда я пытаюсь скомпилировать это, я получаю ошибку о неопределенной ссылка на функцию1(). Я считаю, что при компиляции я все правильно связал. Я довольно ржавый на своем C++. Я уверен, что я просто делаю что-то глупое. Надеюсь, что мой простой примерный код достаточно хорошо иллюстрирует проблему.

Заранее благодарим за любую помощь!

+0

Нельзя сказать ничего о 'C++', но в 'C' вы можете сделать свои объявления функций правильными прототипами ... просто укажите' void' для параметров: 'void fun ction1 (void); ' – pmg

+2

@pmg - Я думал, что это не было« необходимо »с 1989 года! – Flexo

+1

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html – Flexo

ответ

6

Другое решение (к одной предложил первоначально Yann), чтобы окружить заголовок «C» с:

#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef __cplusplus 
} 
#endif 

Который спасает вас от необходимости помнить, чтобы сделать:

extern "C" { 
#include "foo.h" 
} 

каждое место, которое вы используете foo.h

4

Убедитесь в использовании:

extern "C" { 
#include "myHeader.h" 
} 

Или компилятор C++ будет генерировать имена символов, которые являются имя-подогнаны.

Смежные вопросы