LINUX.ORG.RU

Смешанная компиляция. Как g++ подключает объектные файлы gcc?

 , ,


0

1

Доброго времени суток!

Столкнулся с проблемой смешанной компиляции на gcc/g++. Приложение компилится нормально, даже с флагами -Wall -pedantic существенных ворнингов не выдает, но после запуска сразу же вылетает, при этом об ошибке не говорит. Когда запускаю в gdb, говорит, что произошел сегфолт на вызове стандартной функции:

Program received signal SIGSEGV, Segmentation fault.
_IO_vfprintf_internal (s=0x0, format=0x402248 "%s I'm here", ap=0x7fffffffe460) at vfprintf.c:1278
1278	vfprintf.c: Нет такого файла или каталога.

Также, если забыть про GCC и все компилить в G++, поправив файлы (забыть про cfunctions, внести эти функции в daemon.cpp), то все запускается и работает.

Ах да, вот файл проекта.

Подскажите, где косячит сборка?

★★

Последнее исправление: aido (всего исправлений: 1)

Ответ на: комментарий от aido

комментарии о структуре проекта приветствуются.

У тебя смесь табов и пробелов.

Stil ★★★★★
()

Традиционно декларации оборачивают в extern "C" { }, чтобы имена искажались одинаково. Так как в C такая конструкция не приветствуется, её оборачивают в #ifdef __cplusplus: http://stackoverflow.com/questions/3789340/combining-c-and-c-how-does-ifdef-c...

А вообще у тебя бардак с оформлением кода. Про смесь табов и пробелов уже говорили. Вроде не говорили про то, что иногда у тебя отступ внезапно меняется. В C++ файлах какая-то феерия с strcpy и strcat вместо простой и безопасной std::string. Взаимодействие между модулями через общие данные, LOG_FILE. Причём extern ты объявляешь даже не в заголовке сишного модуля, а прямо в C++ коде. Кстати, на этом и лажает, скорее всего.

i-rinat ★★★★★
()
Ответ на: комментарий от Stil

ЭЭЭ. пока все нормально. При изменении структуры проекта забыл поменять в webusb_daemon_conf.h путь к конфигу

aido ★★
() автор топика
Ответ на: комментарий от aido

Функциями.

// file.h
#pragma once

void log_set_file_name(const char *name);
const char *log_get_file_name(void);
void log_teardown(void);

// file.c
#include <string.h>
#include "file.h"

static char *filename = NULL;

void log_set_file_name(const char *name) {
  if (filename)
    free(filename);
  filename = strdup(name);
}

const char *log_get_file_name(void) {
  return filename;
}

void log_teardown(void) {
  if (filename) {
    free(filename);
    filename = NULL;
  }
}
i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)

Мне показалось, или файл выложили через вконтачик? Чо, всякие dpaste и gist.github.com уже сломались?

AnDoR ★★★★★
()
Ответ на: комментарий от AnDoR

не показалось. pastebin сломался (не у всех провайдеров), про dpaste не знал. до гитхаба пока проектик не дорос=)

aido ★★
() автор топика
Ответ на: комментарий от i-rinat
  if (filename)
    free(filename);

RTFM чтоли

The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc(), or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.

kawaii_neko ★★★★
()

Традиционно советую valgrind. Хотя, тут уже сказали про нулевой указатель.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.