c - 在 C 语言中使用 GEOS API 函数返回段错误

标签 c segmentation-fault geos

我正在尝试使用我的 C 程序中的一些 libgeos ( https://github.com/libgeos/geos ) 函数。下面是我的代码。

#include <stdio.h>
#include <geos_c.h>

int main() {

    GEOSContextHandle_t ctx  =  GEOS_init_r();

    GEOSGeometry *inputGeom = GEOSGeomFromWKT("MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)), ((15 5, 40 10, 10 20, 5 10, 15 5)))");

    printf("%s\n", GEOSGeomToWKT(inputGeom));

    GEOS_finish_r(ctx);

    return 0;
}

但问题是当我运行二进制文件时遇到段错误。下面是我用来编译程序的gcc命令。

gcc -g -Wall geos.c -o geos -lgeos_c

请参阅下面的 gdb 输出。

(gdb) run
Starting program: /home/srimal/proj/src/geos/geos 
warning: the debug information found in "/lib64/ld-2.27.so" does not match "/lib64/ld-linux-x86-64.so.2" (CRC mismatch).


Program received signal SIGSEGV, Segmentation fault.
__strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:62
62      ../sysdeps/x86_64/multiarch/strlen-avx2.S: No such file or directory.

如果有人能帮助我解决这个问题,我将非常感激。

最佳答案

问题已解决。我应该使用 initGEOSfinishGEOS 函数。以下是经过一些改进的正确答案。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#include <geos_c.h>

void notice(const char *fmt, ...) {
    va_list ap;
    fprintf( stdout, "NOTICE: ");
    va_start (ap, fmt);
    vfprintf( stdout, fmt, ap);
    va_end(ap);
    fprintf( stdout, "\n" );
}

void log_and_exit(const char *fmt, ...) {
    va_list ap;
    fprintf( stdout, "ERROR: ");    
    va_start (ap, fmt);
    vfprintf( stdout, fmt, ap);
    va_end(ap);
    fprintf( stdout, "\n" );
    exit(1);
}

int main() {

    initGEOS(notice, log_and_exit);

    GEOSGeometry *inputGeom = GEOSGeomFromWKT("POINT (30 10)");

    if (inputGeom == NULL) {
        fprintf(stderr, "NULL GEOM");
        return 0;
    }

    printf("%s\n", GEOSGeomToWKT(inputGeom));

    finishGEOS();
    return 0;
}

关于c - 在 C 语言中使用 GEOS API 函数返回段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55592141/

相关文章:

C 结构是否会干扰类型转换?

从 C 创建 Direct3DEx 接口(interface)不起作用

c - 如果我们将它与 if 和 'equal to' 运算符一起使用,为什么 float 会给出不同的输出?请看下面的代码 :

linux - SSB dbgen Linux - 段错误

ruby-on-rails - Ubuntu 14.04、Ruby on Rails 和 GEOS

c - 将 main 中定义的类型传递给 C 中的 header

c - 为什么在写入使用字符串初始化的 "char *s"时会出现段错误,而不是 "char s[]"?

c - 段错误 : 11 c structures

ruby - 如何使用 native Ruby 绑定(bind)安装 GEOS?

django - GeoDjango:加速 GEOS 的几何运算