2014-03-24 3 views
0

Я пытаюсь использовать libreDWG, чтобы открыть и понять некоторые файлы dwg. Я установил его и, по крайней мере, попробовал запустить некоторые из тестовых программ (даже если они впоследствии исчезнут). Во всяком случае, я включил небольшой заголовочный файл в свой проект, очень похожий на простой пример, найденный здесь. https://github.com/h4ck3rm1k3/libredwg/blob/master/examples/load_dwg.c Кажется, что существует общая проблема с типами данных (по крайней мере, так, как я их компилирую), что я добавил несколько приведения формы (char *) к числу переменных, которые ранее пытались автоматически конвертировать (void *) и (unsigned char *) в тип (char *) и избавлялись от жалоб компилятора. Но даже до сих пор, когда я скомпилировать его как такссылка на libredwg в ​​C++ не работает

g++ xxx.c++ -L/opt/local/lib/ -lredwg -o program_name 

я получаю следующее сообщение об ошибке:

Undefined symbols for architecture x86_64: 
    "dwg_read_file(char*, _dwg_struct*)", referenced from: 
    load_dwg(char*)in ccN6HUqz.o 
    "dwg_free(_dwg_struct*)", referenced from: 
     load_dwg(char*)in ccN6HUqz.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

Я не знаю, что делать, я фиксированной любые проблемы в источнике компилятор жалуется и связываюсь с соответствующими библиотеками с -lredwg (правда? Я не пропустил никаких?). Мой заголовочный файл просто проверяет функциональность и выглядит так:

#include "suffix.c" 
#include <dwg.h> 

plan floor_plan;//temporary data structure defined elsewhere for now 


void 
add_line(double x1, double y1, double x2, double y2) 
{ 

    line_in temp; 
    temp.start.x=x1; 
    temp.start.y=y1; 
    temp.end.x=x2; 
    temp.end.y=y2; 
    floor_plan.lines.push_back(temp); 
    std::cout<<"LINE: :"<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<std::endl; 

} 

void 
add_circle(double x, double y, double R) 
{ 
    // Yet to do 
} 

void 
add_text(double x, double y, char *txt) 
{ 
    // Make something with that 
} 

int 
load_dwg(char *filename) 
{ 
    unsigned int i; 
    int success; 
    Dwg_Data dwg; 

    dwg.num_objects = 0; 
    success = dwg_read_file(filename, &dwg); 
    for (i = 0; i < dwg.num_objects; i++) 
    { 
     Dwg_Entity_LINE *line; 
     Dwg_Entity_CIRCLE *circle; 
     Dwg_Entity_TEXT *text; 

     switch (dwg.object[i].type) 
     { 
      case DWG_TYPE_LINE: 
       line = dwg.object[i].tio.entity->tio.LINE; 
       add_line(line->start.x, line->end.x, line->start.y, line->end.y); 
       break; 
      case DWG_TYPE_CIRCLE: 
       circle = dwg.object[i].tio.entity->tio.CIRCLE; 
       add_circle(circle->center.x, circle->center.y, circle->radius); 
       break; 
      case DWG_TYPE_TEXT: 
       text = dwg.object[i].tio.entity->tio.TEXT; 
       add_text(text->insertion_pt.x, text->insertion_pt.y, (char*) text->text_value); 
       break; 
     } 
    } 
    dwg_free(&dwg); 
    return success; 
} 

Что я делаю неправильно? Я считаю, что libredwg написано в c. Это проблема?

ответ

1

Кажется, что вы пытаетесь установить связь с 32-битной библиотекой, когда вы находитесь на 64-битной платформе, например, в этом answer. Решение состоит в том, чтобы загрузить (или создать из источника) 64-разрядную версию libredwg. Или, альтернативно, добавьте флаг «-m32» в командную строку g ++ - чтобы создать все приложение в виде 32-битного исполняемого файла.

EDIT: как вы выяснили, что проблема на самом деле вызваны пытаются связать C++ код с библиотекой C без следующих в верхней/нижней части кода:

#ifdef __cplusplus 
extern "C" { 
#endif 

// .. . исходный код здесь

#ifdef __cplusplus 
} 
#endif 

в основном это говорит компилятор not to do C++ name-mangling - коммутационное имя коверкая от позволяет связи между C и C++

+0

Кажется, вероятно, попробовал команду «-m32», был чтобы исправить некоторые «слишком большие» числа, но тогда все мои другие зависимости библиотеки взорвались. (Я использую boost и fltk). Как я построить 64 битную версию, я подумал, что, конечно, это то, что я сделал, когда я побежал Makefile: $ ./configure [опция] $ сделать $ сделать чек $ сделать установку Как указать 64 немного? – user3353819

+0

Запустите configure --help/просмотрите скрипт configure, чтобы узнать, какие опции он поддерживает? согласитесь, он должен автоматически определять ваши настройки платформы и генерировать соответствующий make-файл –

+0

--build или --host кажется довольно стандартным для настройки –