ссылка на libredwg в ​​C ++ не работает

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

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 nowvoid
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. Это проблема?

0

Решение

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

РЕДАКТИРОВАТЬ: как вы обнаружили, проблема на самом деле вызвана попыткой связать код C ++ с библиотекой C без следующего в верхней / нижней части вашего кода:

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

В основном это говорит компилятор не делать C ++ именование — Отключение искажения имени позволяет устанавливать связь между C и C ++.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector