#c #segmentation-fault #geos
#c #ошибка сегментации #geos
Вопрос:
Я пытаюсь использовать некоторые libgeos (https://github.com/libgeos/geos ) функции из моей программы на C. Ниже приведен мой код.
#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("%sn", 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.
Я был бы очень признателен, если кто-нибудь сможет помочь мне решить эту проблему.
Комментарии:
1. Вы это проверили:
inputGeom != NULL
?2. Отлаживайте свою программу шаг за шагом, проверяйте возвращаемые значения и где именно происходит SIGSEGV. Вы должны расширить свой код, чтобы проверить все коды возврата. Можно ли
GEOSGeomToWKT
вернутьNULL
? Возможно, вам следует проверить результат перед использованием значения вprintf
.3. ДА. Я добавил это условие.
4. Спасибо всем. Наконец, код работает. 🙂 Я опубликовал исправленный код в качестве ответа.
Ответ №1:
Решена проблема. Я должен был использовать функции initGEOS
и finishGEOS
. Ниже приведен правильный ответ с некоторыми улучшениями.
#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("%sn", GEOSGeomToWKT(inputGeom));
finishGEOS();
return 0;
}