Не компилится.
36: missing separator
(в этой строке: $(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET) $(KOS_START) $(OBJS) $(OBJEXTRA) )
далее. при попытке поставить двоеточие между $KOS_CC и KOS_CFLAGS
пишет ошибку в 37 (то же самое). ставим и там двоеточие, пока не: mutiple target patterns, stop.
Проверь у себя еще раз и если у тебя запустится то значит у меня косяки.
PHP код:
#
# Basic KallistiOS skeleton / test program
# Copyright (C)2001-2004 Dan Potter
#
# Put the filename of the output binary here
TARGET = hello.elf
# List all of your C files here, but change the extension to ".o"
# Include "romdisk.o" if you want a rom disk.
OBJS = hello.o romdisk.o
# If you define this, the Makefile.rules will create a romdisk.o for you
# from the named dir.
KOS_ROMDISK_DIR = romdisk
# The rm-elf step is to remove the target before building, to force the
# re-creation of the rom disk.
all: rm-elf $(TARGET)
include $(KOS_BASE)/Makefile.rules
clean:
-rm -f $(TARGET) $(OBJS) romdisk.*
rm-elf:
-rm -f $(TARGET) romdisk.*
#$(TARGET): $(OBJS)
# kos-cc -o $(TARGET) $(OBJS)
#Remade the string by the SWAT advise:
#
$(TARGET): $(OBJS)
$(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET) $(KOS_START) $(OBJS) $(OBJEXTRA) $(KOS_LIBS)
$(KOS_STRIP) $(TARGET)
$(KOS_OBJCOPY) -R .stack -O binary $(TARGET) unscrambled.bin
$(KOS_BASE)/utils/scramble/scramble unscrambled.bin 1ST_READ.BIN
run: $(TARGET)
$(KOS_LOADER) $(TARGET)
dist:
rm -f $(OBJS) romdisk.o romdisk.img
$(KOS_STRIP) $(TARGET)
Проверь чтобы перед каждой командой стояла табуляция. Именно табуляция! Там у тебя скорее всего пробелы.
Никаких двоеточий нам лепить не нужно.
Замени это
на это
Вообще конечно странно, у тебя прописана эта команда в Makefile, почему он говорит что ее нет... Может быть ты удалил случайно это?
PHP код:
rm-elf:
-rm -f $(TARGET) romdisk.*
Сват, можешь скинуть полный текст рабочего makefile'а? Пожалуйста.
No rule to make target hello.elf
Лови. Я проверил, работает.
PHP код:
# KallistiOS ##version##
#
# Makefile example
# Copyright (C) 2011 SWAT
#
TARGET = hello
OBJS = hello.o romdisk.o
KOS_ROMDISK_DIR = romdisk
all: rm-elf $(TARGET).elf
include $(KOS_BASE)/Makefile.rules
rm-elf:
-rm -f 1ST_READ.BIN $(TARGET).bin $(TARGET).elf romdisk.*
clean: rm-elf
-rm -f $(OBJS)
$(TARGET).elf: $(OBJS)
$(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET).elf $(KOS_START) $(OBJS) $(OBJEXTRA) $(KOS_LIBS)
$(KOS_STRIP) $(TARGET).elf
$(KOS_OBJCOPY) -R .stack -O binary $(TARGET).elf $(TARGET).bin
$(KOS_BASE)/utils/scramble/scramble $(TARGET).bin 1ST_READ.BIN
О чё добился!
Однако хотелось бы, чтобы буковки "Hello, World!" выводились на экран приставки, а не в консоль-дебаг.
Используй для этого SDL_ttf. ну по крайней мере я через нее выводил
Щас напишу пример.
Спасибо большое)) И еще, где-то объясняется значение этих переменных?
PHP код:
$(TARGET).elf: $(OBJS)
$(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET).elf $(KOS_START) $(OBJS) $(OBJEXTRA) $(KOS_LIBS)
$(KOS_STRIP) $(TARGET).elf
$(KOS_OBJCOPY) -R .stack -O binary $(TARGET).elf $(TARGET).bin
$(KOS_BASE)/utils/scramble/scramble $(TARGET).bin 1ST_READ.BIN
?
Вот текст программы:
PHP код:
#include <kos.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
extern uint8 romdisk[];
KOS_INIT_FLAGS(INIT_DEFAULT | INIT_MALLOCSTATS);
KOS_INIT_ROMDISK(romdisk);
int main(int argc, char **argv)
{
// Инициализация подсистем SDL.
if( SDL_Init( SDL_INIT_VIDEO ) < 0 || TTF_Init() < 0 )
{
printf( "Error: %s\n\n",SDL_GetError() );
return 1;
}
// Установка видеорежима.
SDL_Surface* screen = SDL_SetVideoMode(
640, 480, 16,
SDL_SWSURFACE | SDL_DOUBLEBUF );
if( screen == NULL )
{
printf( "Error: %s\n\n", SDL_GetError() );
return 2;
}
// Загрузка рисунка.
SDL_Surface* image = SDL_LoadBMP( "/rd/hello.bmp" );
// Загрузка файла шрифта.
TTF_Font* font = TTF_OpenFont( "/rd/font.ttf", 24 );
if( font == NULL )
{
printf( "OpenFont error: %s\n\n", SDL_GetError() );
return 3;
}
// Цвет для выводимого текста.
SDL_Color color = { 255, 255, 0, 0 };
// Рендеринг текста в отдельную поверхность.
SDL_Surface* text = TTF_RenderText_Solid(
font,
"Hello, World!",
color );
SDL_BlitSurface( image, NULL, screen, NULL );
// Наложение поверхности текста на поверхность экрана.
SDL_BlitSurface( text, NULL, screen, NULL );
// Обновление экрана (т.е. вывод того что нарисовали на экран).
SDL_Flip( screen );
for( ; ; ){};
return 0;
}
И собственно Makefile:
PHP код:
# ljsdcdev
# showfont makefile
# Lawrence Sebald
# Based on KOS makefiles by Dan Potter
#
KOS_CFLAGS += -I$(KOS_BASE)/../kos-ports/include/SDL-1.2.9 \
-I$(KOS_BASE)/../kos-ports/include/freetype
TARGET = hello
all: 1ST_READ.BIN
include $(KOS_BASE)/Makefile.rules
OBJS = $(TARGET).o
1ST_READ.BIN: $(TARGET).elf
$(KOS_STRIP) $(TARGET).elf
$(KOS_OBJCOPY) -R .stack -O binary $(TARGET).elf $(TARGET).bin
$(KOS_BASE)/utils/scramble/scramble $(TARGET).bin 1ST_READ.BIN
$(TARGET).elf: $(OBJS) romdisk.o
$(KOS_CC) $(KOS_CFLAGS) $(KOS_LOCAL_CFLAGS) $(KOS_LDFLAGS) -o $@ $(KOS_START) $^ -lSDL_ttf -lfreetype -lSDL -lm $(KOS_LIBS)
romdisk.img:
$(KOS_GENROMFS) -f romdisk.img -d romdisk -v
romdisk.o: romdisk.img
$(KOS_BASE)/utils/bin2o/bin2o romdisk.img romdisk romdisk.o
clean:
rm -f $(OBJS) romdisk.o romdisk.img $(TARGET).elf $(TARGET).o $(TARGET).bin 1ST_READ.BIN
(04.04.2011 23:26)Rio писал(а): [ -> ]Спасибо большое)) И еще, где-то объясняется значение этих переменных?
В файлах environ которые лежат в корне kos.
Для простого вывода текста на экран можно использовать bfont (bios font).
sc_maxim, где именно должны стоять символы табуляции, а где можно оставить пробелы? Возможен ли перенос строк? Если да, то каких?
PHP код:
Exception: STATUS_ACCESS_VIOLATION at eip=6100F02F
eax=0022DAD4 ebx=00000000 ecx=00000000 edx=FFFFFFFF esi=00660420 edi=0040435E
ebp=0022CB18 esp=0022CA60 program=C:\cygwin\usr\local\dc\kos\kos\utils\genromfs\genromfs.exe, pid 3308, thread main
cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
Stack trace:
Frame Function Args
0022CB18 6100F02F (00000001, 6116CF08, 6116CF08, 0022CB70)
0022CCE8 004027A5 (00000006, 6116CE20, 00660090, 0022CC70)
0022CD98 61006198 (00000000, 0022CDD0, 61005510, 0022CDD0)
61005510 61004416 (0000009C, A02404C7, E8611021, FFFFFF48)
9 [main] genromfs 3308 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
Вообще, почему так сложно писать эти make-файлы?
Табуляция должна быть перед командами, все остальное можно пробелами.
Если ты хочешь перенести часть строки с командой на новую, то ставь на месте переноса \ (бэкслеш).
Писать makefile не сложно, если знать их принцип.
Попробуй скомпилить сам genromfs.
Та принцип то мне в приципе понятен.... Просто непонятны некоторые закарлючки там, типа символа собаки и т.п. Ладно, неважно все это...
Вобще, честно говоря, грустно мне немного как-то. Думал, скачаю КОС, почитаю, ну максимум там, апи, и буду писать свои проги под дрим... А оказалось столько всего изучить надо - и компиляторы (все другое, не такое как в винде), и командную строку, и makefile'ы, и принцип организации кос, и вообще кучу кучу всего... вот так и разбиваются мечты "юных" девелоперов. за день напишу пинг-понг... ага, куда там... Эх! А ведь так хотелось, так...
Ну а как ты хотел
По сути это *nix style программирование.
Собака отключает вывод результата команды в консоль.
Сват, а есть какие-то 3d-движки ну или хотя бы интерфейся для создания 3d-графики на Дриме? Библиотеки там, я хз.
Ну только порты типа кваки и yeti3d.
А так только API PVR и OpenGL.
Вот кстати идея возникла. Недавно в какой-то умной книжке прочитал, что все библиотечные функции по умолчанию линкуются по одним и тем же адресам. соответственно, возрастает шанс декомпиляции дримовских программ.
это так или нет? (насчет линковки)?
На сколько я понимаю сей процесс, они линкуются в том порядке, в котором они прописаны компилятору. Так как стандартные библиотеки прописаны по умолчанию в конфигах, то соответственно они как правило сидят в одних и тех же местах. Но вот дополнительные библиотеки могут распихивать как угодно.
То же касается компилируемых исходников, если файлы поменять местами в порядке линковки, то они будут находится по другим адресам.
Поэтому то и при компилировании в начало линковки ставят asm код для инициализации железа. Если его поставить вторым или еще каким, но не первым, программа не запустится, так как в начале будет что то другое.
Так что тут зависит от среды, если эта полностью автоматизированная среда, аля Visual Studio, то там вполне может так и быть.
Но я за это не ручаюсь, не читал нужной литературы, все выводы только по собственному опыту делал.