LINUX.ORG.RU

Как инклудить сишные хедеры

 , ,


0

2

Имеется код на c++, в котором инклудится сишный хедер. В хедере есть функция, которая использует арифметику с void*, так что в с++ возникает «error: arithmetic on a pointer to void».

У gcc еще есть -fpermissive. Есть ли способ победить это в clang?

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

Нельзя менять хедер - он не свой, а linux/netfilter_ipv4/ip_tables.h И там кто-то написал

static __inline__ struct xt_entry_target *
ipt_get_target(struct ipt_entry *e)
{
	return (void *)e + e->target_offset;
}

Так что компилируется это с горем пополам только g++ с -fpermissive.

wolph ★★
() автор топика
Последнее исправление: wolph (всего исправлений: 1)
Ответ на: комментарий от a1batross

Исключено. Можешь сам попробовать:

extern "C" {
    #include <linux/netfilter_ipv4/ip_tables.h>
}

int main()
{
    return 0;
}

$ g++ test.cpp 
In file included from test.cpp:2:0:
/usr/include/linux/netfilter_ipv4/ip_tables.h: In function ‘xt_entry_target* ipt_get_target(ipt_entry*)’:
/usr/include/linux/netfilter_ipv4/ip_tables.h:223:19: error: invalid conversion from ‘void*’ to ‘xt_entry_target*’ [-fpermissive]
  return (void *)e + e->target_offset;

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

Так что компилируется это с горем пополам только g++

Арифметика над void* — это gcc-шное расширение.

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

Нету. Разработчики сетевой посистемы ядра Linux советуют модифицировать хедер и закинуть рядом с приложением:

https://www.spinics.net/lists/netfilter-devel/msg26985.html
https://www.spinics.net/lists/netfilter-devel/msg27011.html

Ну и https://stackoverflow.com/questions/43414335/linux-userspace-header-failing-t... :)

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

Нету. Разработчики сетевой посистемы ядра Linux советуют модифицировать хедер и закинуть рядом с приложением:

Это просто невероятно тупо. Такая роспись, что котаны даже сишку не осилили.

Stil ★★★★★
()

Интересная задача, но у меня другой вопрос. Допустим есть три файла, main.cpp, a.hpp, a.cpp, b.hpp, b.cpp. В a.hpp определён класс с какими то членами. В b.hpp определён виртуально отнаследованый от a класс. В main.cpp создаётся экземпляр класса b и затем, после некоторых действий, уничтожается. Всё это дело компилится g++ -c main.cpp a.cpp b.cpp, g++ main.o a.o b.o

Теперь самое важное: в а.hpp добавляем члены и делаем g++ -c a.cpp, а затем g++ main.o a.o b.o без перекомпиляции класса b.

Упадёт ли такая программа?

anonymous
()

Если такого дерьма не слишком много, то можешь добавить свой сишный враппер (и соответственно компилировать его под С). Что-то типа такого: IpTablesWrapper.h

struct xt_entry_target;
struct ipt_entry;

struct xt_entry_target *
ipt_target_get_wrapper(struct ipt_entry *e);

IpTablesWrapper.c

#include "IpTablesWrapper.h"

#include <linux/netfilter_ipv4/ip_tables.h>

struct xt_entry_target *
ipt_target_get_wrapper(struct ipt_entry *e) {
    return ipt_get_target(e);
}

Ну или сделать что-то более комплексное (соответсвтующее твоей задаче). Потом подлинковать к С++ коду...

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

Мне не нужна эта функция вообще. Мне нужно другое содержимое этого хедера - всякие константы, структуры и макросы. А конкретно - обычно я собирал все с g++ и не парился, но в связке с liblua asan стал зверски падать на ровном месте при абсолютно нормальном коде. Хотел пересобрать шлангом и попробовать - и тут такой облом.

Так то понятно что все хедеры можно переписать или обернуть. А потом страдать, если в ядрах в оригинале что то поменяется.

wolph ★★
() автор топика
Последнее исправление: wolph (всего исправлений: 1)
Ответ на: комментарий от wolph
#define void char
#include <something-something.h>
#undef void

Например. Правда, можешь словить кучу лулзов с другими функциями.

P.S. Забавно, что в 2017 году косяки компиляторов из 70х до сих пор доставляют столько проблем.

P.P.S. Мой вариант тоже не работает, там тайпкаст :(

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.