我正在尝试使用libreDWG打开并了解一些dwg文件。我已经安装了它,至少让一些测试程序可以运行(即使以后会隔离故障)。无论如何,我在项目中包含了一个小头文件,非常类似于此处找到的简单示例https://github.com/h4ck3rm1k3/libredwg/blob/master/examples/load_dwg.c数据类型似乎存在一个普遍问题(至少在我进行编译的方式上),这意味着我已经添加了几种形式(char *)到变量数量的转换,这些变量以前试图自动将(void *)和(unsigned 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 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编写的。这是问题吗?
最佳答案
看来您正在64位平台上尝试链接到32位库,例如在answer中。解决方案是下载(或从源代码构建自己)64位版本的libredwg。或者,在您的g ++命令行中添加“ -m32”标志-以将您的整个应用构建为32位可执行文件。
编辑:正如您所发现的,问题实际上是由尝试将C ++代码与C库链接而导致的,而在代码的顶部/底部没有以下内容:
#ifdef __cplusplus
extern "C" {
#endif
// ...源代码在这里
#ifdef __cplusplus
}
#endif
基本上,这告诉编译器not to do C++ name-mangling-关闭名称修饰功能可以在C和C ++之间建立链接
关于c++ - 链接到C++中的libredwg无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22611907/