Давайте условимся сразу: я следую паттерну "изучение обучением", т.е. учу, одновременно изучая, обгоняя читателей на 2-3 "шага" вперед. Однако это не значит, что я ничего не знаю и все, что говорю - обычные копипасты: я стараюсь разобраться в теме, прежде чем писать о ней. Поэтому смело задавайте вопросы, этим вы принесете пользу и себе, и мне: на вопросы, ответ на которые я не знаю, я буду его искать, осозновать и рассказывать вам.
Итак, в этом топике будет небольшой рассказ о том, как скомпилировать и запустить первую программу на своей приставке. Сразу предупреждение: статья мегатехнического плана, почти все содержание касается утомительной, но быстрой настройки компилятора, а в результате вы получите лишь банальный "Hello World". Однако без нее никак.
Будем предполагать как данность, что у вас есть приставка Sony PSP, перепрошитая до последней версии - 3.90 M33-3 (так называемая custom firmware, неофициальная прошивка). О том, как перепрошиваться, уже
рассказывали многие, и останавливаться на этом я не буду. Так же будем считать, что в кирпич ваш вставлена флешка, на которой есть хотя бы 50кб свободного места, и вы имеете к ним доступ (например, через саму PSP).
Скажу сразу: я почти уверен, что ничего плохого с вашей приставкой не случится, если вы будете достаточно аккуратны, но никаких гарантий дать, к сожалению, не могу.
Используемый язык программирования Си, я буду использовать бесплатную IDE
Code::Blocks под Windows XP. Пользователи других компиляторов или ОС могут попробовать настроить IDE сами, благо, настройки у всех похожи; я же использовал то, для чего нашел мануал ;)
Для начала, скачаем набор компиляторов, линкеров и библиотек для PSP под названием
DevKitPSP. Распакуйте его куда-нибудь, я его распаковал в корень диска E: (теперь у меня есть папка E:\devkitpsp\).
Теперь откройте Code::Blocks. В меню выберите Settings→Compiler and Debugger, как Selected Compiler в открывшемся окошке выберите GNU GCC (он должен стоять по умолчанию), скопируйте его, назвав, например, DevKitPSP, и настройте его:
Вкладка Search Directories→Compiler (удалите все, что там есть, и нажимайте Add для добавления каждого из путей):
E:\devkitPSP\include
E:\devkitPSP\psp\include
E:\devkitPSP\psp\sdk\include
Linker:
E:\devkitPSP\lib
E:\devkitPSP\psp\lib
E:\devkitPSP\psp\sdk\lib
Вкладка Toolchain Executables:
Compiler's installation directory: E:\devkitPSP . Там есть примечание, что в этой папке должна быть подпапка bin, проверьте.
C-compiler: psp-gcc.exe
C++-compiler: psp-g++.exe
Linker for dynamic libs: psp-g++.exe
Linker for static libs: psp-ar.exe
Еще три поля я оставил пустыми.
Теперь можно жать OK, и переходить к созданию нового проекта (File→New→Project..., слева в окошке жмем Projects и выбираем Empty). Заполняем Project Title (не играет роли, пусть будет PSPHelloWorld), не забываем поставить папку для сохранения проекта (я вон в первый раз забыл, и получил кучу глюков и ошибок); компилятор, разумеется, ставим свежесозданный нами.
Наш проект девственно пуст, создаем фаил (File→New→File..., на название наплевать, я выбрал main.c) не забудьте в мастере создания фаила выбрать как язык Си и поставить галочки "Add to current project", "Debug" и "Release" (почему они не стоят по умолчанию?).
В созданный фаил копируем
код (ключ доступа - хабрахабр). Я бы сюда закинул, если бы не хабрапарсер. Код писал не я, кстати: опыта пока-что маловато, хотя я вполне понимаю, что там происходит и как - в любом случае, в этом топике я останавливаться на этом не буду.
Теперь последние штрихи к настройке. Мы уже настроили то, с помощью чего будем компилировать, но не настроили, как и что у нас должно выходить. Поэтому жмем правой кнопкой на название проекта справа, выбираем Properties, а там Build targets.
Снимаем галочку "Auto-generate filename extension", и правим в Output filename расширение "exe" на "elf". Выполняем тоже самое для конфигурации Release, жмем Ok.
Жмем правой кнопкой на название проекта опять, выбираем Build Options и, на вкладке Linker Options, вписываем в Other linker options:
-lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lpsplibc -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel
. Повторяем для Release.
Вроде всё (надеюсь, это последняя статья скучного технического плана). Теперь собираем проект (Build→Build или знакомое всем Ctrl-F9) если вдруг появились ошибки, то думаем, что же сделали не так, а потом спрашиваем в комментариях (может, я забыл чего).
Чтобы не настраивать потом заново, стоит сохранить проект как шаблон (File→Save Project as user-template...).
Итак, у нас есть elf-фаил нашей программы. Перед тем, как закидывать его на PSP, надо преобразовать его в EBOOT.PBP (название придумал не я, честно). Для этого у меня стоит такой bat-ник:
"E:\devkitPSP\bin\mksfo.exe" %1/bin/Debug/%1 %1/bin/Debug/%1.sfo
"E:\devkitPSP\bin\psp-fixup-imports.exe" %1/bin/Debug/%1.elf
"E:\devkitPSP\bin\psp-strip.exe" %1/bin/Debug/%1.elf -o %1/bin/Debug/stripped.elf
"E:\devkitPSP\bin\pack-pbp.exe" %1/bin/Debug/EBOOT.PBP %1/bin/Debug/%1.sfo NULL NULL NULL NULL NULL %1/bin/Debug/stripped.elf NULL
Он располагается у меня в директории pspprj, в которой я создаю по папке для каждого проекта. Используется он так: make_eboot.bat HelloWorld . Если у вас другая организация папок, или вы просто хотите его переписать или запускать каждую программу вручную просто запускайте по строчке, не забывая заменять %1 на названия или пути к фаилам. В результате у вас получится фаил EBOOT.PBP, его надо будет закинуть в папку /PSP/GAME150/HelloWorld (или другое название)/, а все остальное можно спокойно удалить. Теперь проверяйте (выход по кнопке Home).
Как "домашнее задание" сделайте так, чтобы все "хелловорлды" были с новой строки. До встречи!
P.S. Вырезал весь "юмор", который сначала вписывал. Всегда самого раздражали тупые шутки в такого рода постах, а в том, что мои шутки не тупы, я быть уверен не могу :)
комментарии (45)
А для пунктуационных у самого скилла не хватает, но чувствую, что они там есть.
Плохой, в общем пост, не доебаться до правописания.
пытался сделать в слове компилятор ошибку, но выходило как-то похоже на клитор. я не против клиторов, вот только могут решить что шутка и не изображать сирани перфекционизм
(сорри за говнокач-во, фотал мобилой!111)
счетчик надо прогать. это минут на 25 былокодерства, но жутко лень )
но я попробую заставить себя (нет! я играю в манхант 2. никаких заставлений не выйдет)
кстати, надо было поставить одно неправильное тире или дефис. после того быдлотопика это - любимая тема ;)
Фу, верните обратно. )
И всё-таки раз код не ваш, то откуда информацию берете. Расшарьте источник пожалуйста :).
к слову, впервые я увидел сей код не там
логику писать - без ООП с классами и строгой типизацией и проч ... как-то тяжко :(
"...я буду его искать, осозновать и рассказывать вам..."
ОсознАвать, конечно же.
"...не забудьте в мастере создания фаила..."
А тут надо: фаЙла.
"В созданный фаил..." и прочее уже ясно.
Я это не со зла, а понты понятие, нам не близкое.
и вообще, мне приятно осознОвать, что в моих фаИлах ошибки не столь важны, сколь информация
psp-g++.exe --help как-то смутно намекает на то, что он еще и линкер (см. опцию -c)
если честно, я не очень хорошо разбираюсь в компиляторах-линкерах, тем более GCC ;) так что если вы сами можете обьяснить, было бы супер; может, даже это надо исправить. в любом случае, я еще поищу на эту тему что-нибудь
если я правильно понял, то это ответ на твой вопрос )
расставить так настройки придумал не я, и думать почему да как не выходит (
У меня какая-то либа не подключилась, похоже?
>> . Повторяем для Release.
для релиза -lpspdebug указывать не надо. он нужен только в дебаг конфиге.
Автору спасибо и мое уважение за проделанный труд, но к сожалению автор не программист, покрайней мере не профессиональный программист.
несколько замечаний:
для того, что бы убрать warning достаточно добавить один include
#include
использовать батник при "живом" IDE нет не какого смысла - в Project/"Build Options" закладка "Pre/Post build steps" можно добавить скрипт для всех таргетов:
"c:\Project\psp\devkitPSP\bin\mksfo.exe" "${PROJECT_NAME}" "${TARGET_OUTPUT_DIR}${PROJECT_NAME}.sfo"
"c:\Project\psp\devkitPSP\bin\psp-fixup-imports.exe" "${TARGET_OUTPUT_FILE}"
"c:\Project\psp\devkitPSP\bin\psp-strip.exe" -o "${TARGET_OUTPUT_DIR}stripped.elf" "${TARGET_OUTPUT_FILE}"
"c:\Project\psp\devkitPSP\bin\pack-pbp.exe" "${TARGET_OUTPUT_DIR}EBOOT.PBP" "${TARGET_OUTPUT_DIR}${PROJECT_NAME}.sfo" NULL NULL NULL NULL NULL "${TARGET_OUTPUT_DIR}stripped.elf" NULL
что избавит от гемороя - запускать батник после каждего билда.