LINUX.ORG.RU

Помогите справиться со static


0

0

Есть заголовочный файл stdfile.h, причем в нем определена и реализована некоторая функция с идентификатором static. Также есть файл myfile.h, где эти функция также определена. К файлу myfile.c подключен stdfile.h. Компилятор видит реализацию, только если идентификатор static убрать, но проблема в том, что stdfile.h - файл большой библиотеки, и мне очень бы не хотелось его править. Самое интересное, что под ядром 2.4 (gcc-2.95) все работало, а под ядром 2.6 (gcc 3.3) - нет. Может быть есть более безболезненный способ это исправить, чем правка заголовочного файла?

anonymous

>ядром 2.4 (gcc-2.95) все работало, а под ядром 2.6 (gcc 3.3)-нет

это никак не зависит от версии ядра а только от твоих познаний в языке С

попробуй поигратся ключиком -std=

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

Попробовал. По умолчанию стоит gnu89. Если ставлю выше, то ничего не меняется, а если ниже, то он не компилит linux/module.h :-( Спасибо за идею, может быть есть другой флаг, который я просто упустил из виду?

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

>то он не компилит linux/module.h

?????

static делает областью видимости один файл только почему новый компилер ограничил область видимости хидером мне непонятно.

может ты указал кривые директивы препроцессора????

хидер frame.h должен начинатся чем-то сильно похожим на :

#ifndef __frame_h #define __frame_h #ifdef __cplusplus extern "C" { #endif

обрати внимание на двойные подчёркивания в начале макроимён.

>может быть есть другой флаг, который я просто упустил из виду?

может но пока что я в этом сомневаюсь

ЗЫ: ещё идея: обработай свой файл препроцессором без компиляции и посмотри что вышло/выйдет

cvv ★★★★★
()

У меня восстановленный по твоему словесному портрету случай, естественно, работает (gcc 3.3.2, linux-2.6.12.5)

Помогло бы, если бы ты сделал небольшой тест, состоящий только из заголовка с какой-нибудь одной функцией (можно с пустым телом, если жалко показывать) и int main (void) { function (); return 0; }, чтобы посмотреть, как же это так может быть. Я, например, не верю

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

Я запускал у себя такой пример: main.c //основной файл #include <linux/module.h> #include "myfile.h" int init_module() { func(); return 0; } void cleanup_module(){;} myfile.h //файл с определением функции int func(); myfile.c//файл, куда подключается стандартный файл с реализацией #include "stdfile.h" stdfile.h //стандартный файл с реализацией функции static void func() {;} Makefile obj-m += resuilt.o resuilt-y += main.o myfile.o Пробовал и resuilt-objs, результат один unknown symbol in module

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

С первого раза не получилось нормально поместить попробую еще раз
Я запускал у себя такой пример:

main.c //основной файл
#include <linux/module.h>
#include "myfile.h"
int init_module()
{
func();
return 0;
}
void cleanup_module(){;}
myfile.h //файл с определением функции
int func();
myfile.c//файл, куда подключается стандартный файл с реализацией #include "stdfile.h"
stdfile.h //стандартный файл с реализацией функции
static void func() {;}
Makefile
obj-m += resuilt.o
resuilt-y += main.o myfile.o
Пробовал и resuilt-objs, результат один
unknown symbol in module

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

Еще одно уточнение: в файле myfile.h написано void func();

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

Ну так а в чем вопрос? Из модуля main definition функции func ни коим образом не виден. Если ты включишь stdfile.h в main.c, то все будет хорошо.

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

Давно бы уже включил, но нельзя. Я ведь не писал этот модуль, мне надо только собрать его под ядро 2.6, а в тех исходниках, которые мне достались все построено именно так, как я показал.

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

почему это "нельзя"? если в .h файле выполнены static-реализации функций, ТО это означает, что любой .c файл, в котором ты хочешь с этими функциями работать, ДОЛЖЕН включать .h файл. Так задумывал человек, который этот .h файл писал. В этом нет ничего страшного, и на работе модуля это никак не отразится - просто один и тот же бинарный код будет входить сразу в несколько объектных файлов, но обычно в .h-файл помещают static inline-функции, поэтому этот как раз то, что нужно.

А исходный вопрос я бы переформулировал проще: "Как заставить gcc работать по правилам моего собственного варианта языка C?" Ответ - никак. Ну или вот, если так хочется, в начало файла stdfile.h написать строку:

#define static

Статические переменные в теле функции конечно при этом работать перестанут, но зато всё остальное - как по маслу.

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

Модуль постоен так, что в файле myfile.h собраны функции из многих стандартных файлов, а не из одного, как я показал в примере. Кроме того кроме тех функций (которые действительно определены как static inline) там еще заданы другие функции и структуры. Иногда там действительно подключается напрямую файл stdfile.h, но в основном используется все-таки myfile.h. Поэтому такие жесткие меры, как #define static здесь вряд ли помогут.

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

тогда нужно 1) разделить .h файл на два - .h и .c, и 2) static-и убрать, где не нужно, 3) попить с первосоздателем пивка за его счёт

понимаю, не хочется, а надо

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

Насчет пивка это ты верно заметил. Похоже, действительно другого способа нет. Спасибо всем за ответы

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

В происходящем нет ничего странного, кроме твоего утверждения, что все работало с ядром 2.4. То что ядро тут роли не играет, это, конечно, понятно, но никакой компилятор/линкер не должны это собирать. Похоже, ты что-то скрываешь от общественности, а если нет, то что-то скрывается от тебя самого.

Попробуй сделанный тобой пример собрать в том окружении, в котором успешно собирается "модуль" - наверняка ведь будет та же ошибка. Так что, мне кажется, ты пытаешься искать монетку под фонарем, а она где-то еще.

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