微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CGO对“ TIFFGetField”的未定义引用

如何解决CGO对“ TIFFGetField”的未定义引用

我主要在Go项目atm上工作,但是由于参数传递,我不得不将CGO用于我的项目的一部分,目的是使用Go用C编辑Go的TIF文件。我不熟悉C,但这似乎是解决我们问题的唯一方法

问题是当我从理论上设置Go部件并想使用我的C代码时,它会通过TIFfgetField,_TIFFmalloc,TIFFReadRGBaimage函数调用删除undefined reference to xxxx'`。

可能我什至没有以正确的方式导入libtiff库。 有趣的是,C代码本身的第一个代码TIFF* tif = TIFFOpen("foo.tif","w");没有对TIFFOpen的引用错误,只有其他错误(TIFfgetField,_TIFFmalloc,TIFFReadRGBaimage,_TIFFfree,TIFFClose)

我的验证码是

package main

// #cgo CFLAGS: -Ilibs/libtiff/libtiff
// #include "tiffeditor.h"
import "C"

func main() {
    C.tiffEdit()
}
#include "tiffeditor.h"
#include "tiffio.h"

void tiffEdit(){
    TIFF* tif = TIFFOpen("foo.tif","w");
    if (tif) {
        uint32 w,h;
        size_t npixels;
        uint32* raster;

        TIFfgetField(tif,TIFFTAG_IMAGEWIDTH,&w);
        TIFfgetField(tif,TIFFTAG_IMAGELENGTH,&h);
        npixels = w * h;
        raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
        if (raster != NULL) {
            if (TIFFReadRGBaimage(tif,w,h,raster,0)) {
            //
            }
            _TIFFfree(raster);
        }
        TIFFClose(tif);
    }
}

我的首要目标只是使用go代码建立libtiff并使其能够识别libtiff函数,因此我可以专注于解决问题本身。

解决方法

如果在cgo中看到消息“未定义对xxx的引用”。您很可能会丢失与共享库的链接。

我对该软件包不太熟悉,但是我建议您尝试添加以下内容,以使程序链接到C动态库:

// #cgo LDFLAGS: -lyour-lib

在上述情况下,我将go程序链接到一个名为“ libyour-lib.so”的C动态库。

示例

假设您的TIFF来源来自http://www.simplesystems.org/libtiff/

步骤

  1. 下载源代码
  2. 检查README.md(或INSTALL)以阅读有关如何编译此C库的指南
  3. 按照提供的说明进行操作并安装C库
  4. 如果未修改默认设置就可以正确执行操作,则应该在/ usr / local / include中找到tiff标头,并在/ usr / local / lib中找到其动态库
  5. 通过为cgo编译器提供适当的提示,将这些内容集成到go程序中。

代码

我已经成功构建了该程序,并按预期执行。这对您来说可能是一个很好的起点。

package main

// #cgo LDFLAGS: -ltiff
// #include "tiffio.h"
// #include <stdlib.h>
import "C"

import (
    "fmt"
    "unsafe"
)

func main() {
    path,perm := "foo.tif","w"

    // Convert Go string to C char array. It will do malloc in C,// You must free these string if it no longer in use.
    cpath := C.CString(path)
    cperm := C.CString(perm)

    // Defer free the memory allocated by C.
    defer func() {
        C.free(unsafe.Pointer(cpath))
        C.free(unsafe.Pointer(cperm))
    }()

    tif := C.TIFFOpen(cpath,cperm)
    if tif == nil {
        panic(fmt.Errorf("cannot open %s",path))
    }

    C.TIFFClose(tif)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。