【问题标题】:linking to libredwg in c++ not working在 C++ 中链接到 libredwg 不起作用
【发布时间】:2014-05-01 22:58:54
【问题描述】:

我正在尝试使用 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 编写的。是这个问题吗?

【问题讨论】:

    标签: c++ c compilation linker dwg


    【解决方案1】:

    当您在 64 位平台上时,您似乎正在尝试链接到 32 位库,就像在这个 answer 中一样。解决方案是下载(或从源代码自己构建)一个 64 位版本的 libredwg。或者将“-m32”标志添加到您的 g++ 命令行 - 将您的整个应用程序构建为 32 位可执行文件。

    编辑:正如您所发现的,问题实际上是由于尝试将 C++ 代码与 C 库链接而导致代码顶部/底部没有以下内容:

    #ifdef __cplusplus 
    extern "C" { 
    #endif
    

    // ...这里是源代码

    #ifdef __cplusplus
    } 
    #endif 
    

    这基本上告诉编译器 not to do C++ name-mangling - 关闭名称修饰允许 C 和 C++ 之间的链接

    【讨论】:

    • 似乎很可能,尝试了“-m32”命令,不得不修复一些“太大”的数字,但随后我所有的其他库依赖项都爆炸了。 (我正在使用 boost 和 fltk)。如何构建 64 位版本,我认为这肯定是我在运行 makefile 时所做的: $ ./configure [options] $ make $ make check $ make install How do I specify 64 bit?
    • 运行 configure --help / 浏览一下配置脚本,看看它支持哪些选项?同意,它应该自动检测您的平台设置并生成适当的 makefile
    • --build 或 --host 似乎非常适合配置
    • 这似乎很有可能奏效!我尝试使用 ./configure --host=x86_64 --build=x86_64 重新安装,它可以工作,但是当运行 make 等时,它只输出几行,如 'make[1]: Nothing to be done for 'all'。 '当我再次尝试编译时,它不起作用。我是否需要以某种方式卸载或通知 configure 覆盖现有实例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多