Здравствуйте, Molchalnik, Вы писали:
M>в общем,пишу первый в жизни make, компилящий один cpp и один .c файл
Лучше бы этот Makefile в студию.
M>процесс завершается с ошибкой "не найден cplusplus.c", хотя реальный файл "cplusplus.cpp"
С ходу предполагаю, что в файле есть зависимость бинарника от .o-файлов и не указаны собственно исходные файлы.
Обычно рекомендуется или наоборот (список исходников, а из них вычисляются объектники), или явное описание зависимостей каждого .o от соответствующего исходного.
Ещё не указана платформа. Если это Unix, то .cpp по умолчанию может быть суффиксом для входа для препроцессора Си, а не компилятора Си++ (за которым зарезервированы .C, .cc, .cxx). Это уже зависит от флавора системы.
Здравствуйте, netch80, Вы писали:
N>С ходу предполагаю, что в файле есть зависимость бинарника от .o-файлов и не указаны собственно исходные файлы. N>Обычно рекомендуется или наоборот (список исходников, а из них вычисляются объектники), или явное описание зависимостей каждого .o от соответствующего исходного.
N>Ещё не указана платформа. Если это Unix, то .cpp по умолчанию может быть суффиксом для входа для препроцессора Си, а не компилятора Си++ (за которым зарезервированы .C, .cc, .cxx). Это уже зависит от флавора системы.
и другие шамании, не помоглго. помогает только прямое, "лобовое" прописывание файлов, а зделать проект так, чтобы он автоматом разбирал, какой файл сишный, какой сиплюсплюсовский, не выходит
Здравствуйте, Molchalnik, Вы писали:
M>Здравствуйте, netch80, Вы писали:
N>>С ходу предполагаю, что в файле есть зависимость бинарника от .o-файлов и не указаны собственно исходные файлы. N>>Обычно рекомендуется или наоборот (список исходников, а из них вычисляются объектники), или явное описание зависимостей каждого .o от соответствующего исходного.
N>>Ещё не указана платформа. Если это Unix, то .cpp по умолчанию может быть суффиксом для входа для препроцессора Си, а не компилятора Си++ (за которым зарезервированы .C, .cc, .cxx). Это уже зависит от флавора системы.
M>и другие шамании, не помоглго. помогает только прямое, "лобовое" прописывание файлов, а зделать проект так, чтобы он автоматом разбирал, какой файл сишный, какой сиплюсплюсовский, не выходит
Чел, так Вы модули ядра на С++ писать вздумали? В каком ВУЗе Вас такому обучили?
В срочке $(MAKE) -C $(KDIR) M=$(PWD) ... Вы запускаете kenel-овский Makefile из /lib/modules/`uname -r`/build
который и компилит Ваши файлы, и это Makefile ничего про C++ не знает.
M>>и другие шамании, не помоглго. помогает только прямое, "лобовое" прописывание файлов, а зделать проект так, чтобы он автоматом разбирал, какой файл сишный, какой сиплюсплюсовский, не выходит
S>Чел, так Вы модули ядра на С++ писать вздумали? В каком ВУЗе Вас такому обучили?
Ни в каком. Просто писать на уровне ядра мне привычней на плюсах. Конечно, нужно это делать умеючи. Иначе будет фэйл.
Впрочем, на линухе я такого ещё не пробовал
S>В срочке $(MAKE) -C $(KDIR) M=$(PWD) ... Вы запускаете kenel-овский Makefile из /lib/modules/`uname -r`/build S>который и компилит Ваши файлы, и это Makefile ничего про C++ не знает.
Здравствуйте, Molchalnik, Вы писали:
M>Ни в каком. Просто писать на уровне ядра мне привычней на плюсах. Конечно, нужно это делать умеючи. Иначе будет фэйл.
Это не win, для линуха в ядро пилят только на благородном C.
M>И что делать? как "припаять" плюсовый файл?
Если сможете написать на плюсах так, чтоб его переварил компилятор чистого C из gcc,
то тогда останется только файлы писать с расширением .c, или переписывайте всё ядро на плюсы.
S>Если сможете написать на плюсах так, чтоб его переварил компилятор чистого C из gcc, S>то тогда останется только файлы писать с расширением .c, или переписывайте всё ядро на плюсы.
ну, а если сделать объектник из cpp файлов, и функции из него подключить в C файл?
для чего вообще тогда obj файлы нужны, если нельзя писать на разных языках?
M>>Ни в каком. Просто писать на уровне ядра мне привычней на плюсах. Конечно, нужно это делать умеючи. Иначе будет фэйл.
S>Это не win, для линуха в ядро пилят только на благородном C.
Дело не в уважении к традициям, а как сделать именно так. Как пират я имею возможность не уважать даже самые благородные традиции Английского Военно-морского Флота.
Просто есть задача — пришпилить к модулю функции из C++. Предположим, что функции на С++ написаны так, что они гарантированно будут работать даже в драйвере или модуле линукс.
То, что так обычно не делают — я знаю, и беру ответственность за это на себя. Осознанно и с полным пониманием возможных последствий. Поэтому вернёмся к вопросу — и я очень рассчитываю на вашу помощь, форумчане!!!
Здравствуйте, Molchalnik, Вы писали: M>>>Ни в каком. Просто писать на уровне ядра мне привычней на плюсах. Конечно, нужно это делать умеючи. Иначе будет фэйл.
Он и случился.
S>>Это не win, для линуха в ядро пилят только на благородном C.
M>Дело не в уважении к традициям, а как сделать именно так. Как пират я имею возможность не уважать даже самые благородные традиции Английского Военно-морского Флота.
Не уважаете — действуйте как пират, против всех правил, компилите свои крестовые файлы руками в объектник.
Если сумеете не потянуть ничего из STL и прочих стандартных либ (даже libc), то оно может даже слинковаться, если сумеете через extern "C" свои функции обозвать или позвать их из ядра промангленными.
M>Просто есть задача — пришпилить к модулю функции из C++. Предположим, что функции на С++ написаны так, что они гарантированно будут работать даже в драйвере или модуле линукс.
Они там гарантированно работать не будут, скорее всего Вы даже не подозреваете, с какими опциями оно должно компилиться. Впрочем, V=1 Вам в руки.
M>То, что так обычно не делают — я знаю, и беру ответственность за это на себя. Осознанно и с полным пониманием возможных последствий. Поэтому вернёмся к вопросу — и я очень рассчитываю на вашу помощь, форумчане!!!
Какую именно ответственность Вы на себя берёте? Ну вот Вам последствие — не компилится, понимайте его.
Вы уж лучше на шарпе или дотнетовском басике, чтобы совсем кроссплатформенно, да и удобнее так. Ещё Дельфи хорош и PHP.
Здравствуйте, cures, Вы писали:
C>Здравствуйте, Molchalnik, Вы писали: M>>>>Ни в каком. Просто писать на уровне ядра мне привычней на плюсах. Конечно, нужно это делать умеючи. Иначе будет фэйл.
C>Он и случился.
Поправь меня, если ошибаюсь. Разве недостаточно выкинуть всё, что требует инициализации run-time? любое статическое задание объектов, исключения, нетривиальные конструкторы, виртуальные классы и виртуальное наследование? классы создавать только через alloc и placement-new?
естественно, стандартные либы тянуть нельзя, ибо исключения.
Я что-то ещё забыл или не учёл?
S>>>Это не win, для линуха в ядро пилят только на благородном C.
M>>Дело не в уважении к традициям, а как сделать именно так. Как пират я имею возможность не уважать даже самые благородные традиции Английского Военно-морского Флота.
C>Не уважаете — действуйте как пират, против всех правил, компилите свои крестовые файлы руками в объектник. C>Если сумеете не потянуть ничего из STL и прочих стандартных либ (даже libc), то оно может даже слинковаться, если сумеете через extern "C" свои функции обозвать или позвать их из ядра промангленными.
M>>Просто есть задача — пришпилить к модулю функции из C++. Предположим, что функции на С++ написаны так, что они гарантированно будут работать даже в драйвере или модуле линукс.
C>Они там гарантированно работать не будут, скорее всего Вы даже не подозреваете, с какими опциями оно должно компилиться. Впрочем, V=1 Вам в руки.
главное, чтобы rti не тянул — инициализацию в run-time
M>>То, что так обычно не делают — я знаю, и беру ответственность за это на себя. Осознанно и с полным пониманием возможных последствий. Поэтому вернёмся к вопросу — и я очень рассчитываю на вашу помощь, форумчане!!!
C>Какую именно ответственность Вы на себя берёте? Ну вот Вам последствие — не компилится, понимайте его.
M>>Дело не в уважении к традициям, а как сделать именно так. Как пират я имею возможность не уважать даже самые благородные традиции Английского Военно-морского Флота.
C>Не уважаете — действуйте как пират, против всех правил, компилите свои крестовые файлы руками в объектник. C>Если сумеете не потянуть ничего из STL и прочих стандартных либ (даже libc), то оно может даже слинковаться, если сумеете через extern "C" свои функции обозвать или позвать их из ядра промангленными.
я пытаюсь скомпилить в объектник, а потом вызвать Makefile из директории сырцов ядра. проблема в том, что я не знаю, как указать ему c++ объектник.
А и правда, где у Вас определены cpp_init и cpp_cleanup? Они только объявлены.
А вот hello_init и hello_cleanup два раза определены, как статические в kernel.c и как глобальные в main_module.cpp
Там не только исключения и инициализация, ещё функций библиотечных нет
Ну и компилить надо с каким-нибудь пиком, с определённым размером стека и прочими тонкостями.
Здравствуйте, cures, Вы писали:
C>Здравствуйте, Molchalnik, Вы писали:
C>А и правда, где у Вас определены cpp_init и cpp_cleanup? Они только объявлены. C>А вот hello_init и hello_cleanup два раза определены, как статические в kernel.c и как глобальные в main_module.cpp
Даже после исправления этого бага проект не заработал. По неизвестным мне причинам. При этом он скомпилился, но отказался регистрироваться, если в инициализации есть хотя бы один вызов cpp функции. Возможно, дело в том, что я даже не пытался применять хитрые ключи компиляции, или ещё что-то.
Но вот тут есть интересная статья. Проект, собранный по этой статье с некоторым допиливанием напильником работает. Ключи там рекомендуются -fno-builtin -fno-exceptions -fno-rtti -nostdinc, но при реальной комплияции происходит фигня, и в лог ядро линуха пишет рекомендацию перекомпилировать с ключом -mcmodel=kernel. С этим ключом работает уже лучше.
Но при этом замечаем, что в кроме инициализация и деинициализация, а внутри них нет вызова cpp.
Добавляем в инициализацию вызов функции start_driver, и получаем крах системы и перезагрузку. Почему? Потому что там некорректно используется new, та форма этого оператора, которая не переопределена.
Правим определения оператора new, и всё начинает нормально работать. Позже добавлю определения файлов.
Здравствуйте, Molchalnik, Вы писали:
M>Так, кстати говоря, и не понял, почему мой вариант не заработал
Так в итоге заработал или нет? Ваш — это который? Без ключей компиляции и со "стандартным" new? Он и не мог.
При компиляции матюги в лог ядра — это сильно! Или это в лог сборки? Так линкер наверное и сказал, что именно ему не понравилось? В целом — там совсем другая управляющая среда, если нужны детали — изучите получившиеся объектники и модуль, где какие секции, какие символы и так далее. Но это — не для слабых духом! И от крестов практически ничего в итоге не остаётся. Вы всё ещё уверены, что оно Вам надо?
Здравствуйте, cures, Вы писали:
C>Здравствуйте, Molchalnik, Вы писали:
M>>Так, кстати говоря, и не понял, почему мой вариант не заработал
C>Так в итоге заработал или нет? Ваш — это который? Без ключей компиляции и со "стандартным" new? Он и не мог.
Мой не заработал в принципе, хотя там просто вызывались пустые c++ функции, ничего не делающие.
C>При компиляции матюги в лог ядра — это сильно! Или это в лог сборки? Так линкер наверное и сказал, что именно ему не понравилось? В целом — там совсем другая управляющая среда, если нужны детали — изучите получившиеся объектники и модуль, где какие секции, какие символы и так далее. Но это — не для слабых духом!
printk куда пишет? Слабоват я ещё в линухе.
C>При компиляции матюги в лог ядра — это сильно! Или это в лог сборки?
Нет. В том-то и фишка, что скомпилилось нормально, но само ядро написало в лог, спецом для таких, как я, что нужно компилить с этим ключом
Jun 3 13:54:12 localhost kernel: overflow in relocation type 10 val ffffffffa00a4174
Jun 3 13:54:12 localhost kernel: `mydrv' likely not compiled with -mcmodel=kernel
C> И от крестов практически ничего в итоге не остаётся.
???
шаблоны, классы, наследования?
Просто нужно мини-либу создать. например такую, которая будет создавать объект нужного типа
Весь дважды трефовый С++ остаётся, другое дело, что если вам нужен список, вектор, отображение или операции с плавающей запятой — пишите ручками.
C>Вы всё ещё уверены, что оно Вам надо?
Я уже сопровождал крупный кросс-платформенный проект с такими ограничениями. Ничего, живой и даже не особо пугаюсь.
Зато я получаю шаблоны, фабрики, умные указатели (при необходимости), и улучшенную организацию кода.