Линковка сишной библиотеки в CPP
От: cpp_beginner  
Дата: 26.04.10 08:52
Оценка:
Использую сишную библиотеку libxnee в проекте C++
Создаю класс обертки xnee_wrapper.
Подключаю хедеры в xnee_wrapper.h (перед всеми остальными хедерами)
extern "C"{
#include "libxnee/print.h"
#include "libxnee/xnee.h"
#include "libxnee/xnee_record.h"
#include "libxnee/xnee_grab.h"
#include "libxnee/xnee_alloc.h"
#include "libxnee/xnee_replay.h"
#include "libxnee/xnee_setget.h"
#include "libxnee/xnee_fake.h"
#include "libxnee/xnee_error.h"
#include "libxnee/xnee_session.h"
}

#include <map>
#include <string>

class xnee_wrapper{
...


Ругается на multiple definition

g++ -o xtrace main.o cmd_params.o xnee_wrapper.o -lxnee -lX11 -lXtst -ldl -lpthread -lboost_program_options
cmd_params.o: (.bss+0x0) : multiple definition of `xnee_data_types'
...


Стражи включения есть!

Переношу секцию extern "C" в xnee_wrapper.cpp — линкуется.
Но в этом случае не работает упреждающее определение типов.
// файл xnee_wrapper.h

// для создания указателя на сишную структуру
struct xnee_data;

class xnee_wrapper {
public:
    xnee_wrapper();
    ~xnee_wrapper();
    
private:
    xnee_wrapper(const xnee_wrapper& orig);
    xnee_wrapper& operator=(const xnee_wrapper& orig);
    xnee_data *xd; // вот этого указателя
};

При этом ругается на повторное определение:

error: using typedef-name ‘xnee_data’ after ‘struct’
/usr/include/libxnee/xnee.h:603: error: ‘xnee_data’ has a previous declaration here


Возможно, потому что тип структуры определен через typedef?
// файл /usr/include/libxnee/xnee.h
typedef struct{
...
} xnee_data;


Компилятор gcc version 4.4.1.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.