Код (Text): #include <windows.h> #pragma comment(linker, "/ENTRY:aWinMain") #pragma comment(linker, "/MERGE:.rdata=.text") #pragma comment(linker, "/MERGE:.data=.text") #pragma comment(linker, "/SECTION:.text,EWRX") int WINAPI aWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Hello, Win32 world!", "Hello from Message Box", MB_OK); return 0; } Все делаю как надо , отключил либы, проект компилится но не собирается , подскажите как писать на WinAPI чистом , чтобы проекты могли линковаться.... UNICODE отключен...
1>123.obj : error LNK2001: неразрешенный внешний символ "__RTC_CheckEsp" 1>123.obj : error LNK2001: неразрешенный внешний символ "__RTC_CheckEsp" 1>123.obj : error LNK2001: неразрешенный внешний символ "__RTC_Shutdown"
Phuntik выше смотри _DEN_ там много всего и мало по теме , переводить долго все оч , просто я хочу писать чтобы выходной файл был оч. маленький возможно я отключаю все библиотеки , а надо какие то определенные.
BlagJack Что за компилятор? MSVC 9 Express ругается на #pragma comment(linker, "/SECTION:.text,EWRX") и в его хелпе флаг X не прописан. Без него всё скомпилилось и заработало. Кстати зачем параметры в main? если их некому заполнять ) Достаточно: int aWinMain(void) {...} или #pragma comment(linker, "/ENTRY:main") int main(void) {...} Проверил и в release и в debug и с unicode - всё ОК )
Код (Text): #include <windows.h> #pragma comment(linker,"/ENTRY:WinMain") #pragma comment(linker,"/MERGE:.rdata=.data") #pragma comment(linker,"/MERGE:.text=.data") #pragma comment(linker,"/NODEFAULTLIB") int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Hello !", "Hello from MessageBox", MB_OK); return 0; } вот это не компилится вообще.... то я скомпилил и в 2005 , в 2008 знаю. Y_Mur в том случае и у меня компилится , но размер 15.5 кб это много. Тут смысл что библиотеки когда отключаю стандартные не компилится , линкер ругается на несколько запрешенных символов , может надо отключать не все , а только определенные библиотеки?
отключи runtime-проверки. возможно #pragma comment(linker, "/ENTRY:aWinMain") из-за вот этого не линкуется CRT, где и находятся __RTC_CheckEsp и т.д.
очень много вариантов перепробовал , еще ругался , на ссылки на запрещенный символ , я использовал /INCLUDE но тоже все , что не делаю все теже ошибки, если не использовать /NODEFAULTLIB то все норм...
BlagJack У меня твой первый код в release 4кб (убрал только непонятный флаг Х) А при ключе /NODEFAULTLIB нужно: Свойства проекта / C/C++ / создание кода / проверка переполнения буфера / нет Забавно, что в первом варианте это не потребовалось и ничего лишнего в коде нет PS: Кстати принимать return 0; без CRT тоже некому так что если хочешь вернуть код завершения программы: #pragma comment(linker, "/ENTRY:main") void main(void) { MessageBox(NULL, "Hello, Win32 world!", "Hello from Message Box", MB_OK); ExitProcess(0); }
Настройки проекта -> C/C++ -> Code Generation. Вырубай Buffer Security Check и Basic Runtime Checks. Linker -> Input Ставь флаг Ignore All Default Libraries.
Y_Mur Кстати принимать return 0; без STL тоже некому только не STL, а ф-ция CRT отвечающая за инициализацию.
Y_Mur,deLight,n0name_DEN_ спс , все заработало , действительно 4 кб =) я правда где- то читал, что есть возможность еще уменьшить файл без помощи упаковщиков и проч , вы может знаете что-нить по этому поводу ? =)
секции выравниваются на FileAlignment, между заголовком и первой секцией может быть пустая область, ее можно заюзать... учитывая что MERGE ты уже заюзал, других вариантов не вижу
BlagJack Можно ещё уменьшить, если в Configuration Properties -> Linker -> Command Line в разделе Additional Options явно указать: /ALIGN:4096 . Это по сути параметр выравнивания секций в памяти, но компилятор тогда меняет FileAlignment с четырёх на полкилобайта.
1кБ из этих четырёх "ест" манифест, его можно запретить: Configuration Properties -> Linker -> файл манифеста -> создавать манифест -> нет Гы-гы: А после удаления извращений с объединением секций и установкой атрибутов, без манифеста стало 2,5кБ ) Выравнивание не трогал Код (Text): #include <windows.h> #pragma comment(linker, "/ENTRY:main") void main(void) { MessageBox(NULL, L"Hello, Win32 world!", L"Hello from Message Box", MB_OK); return; // или ExitProcess(0); // если нужен код завершения }
Y_Mur 2,5 КБ - это странновато. А генерацию Debug Info отключили хоть? Кстати, странно... сейчас проверил... файловое выравнивание и без /ALIGN:4096 ставится на полкилобайта. Раньше сто процентов без этого в четыре килобайта выставлялось, пока не поставлю /ALIGN:4096 . P.S. Да... выставлялось и выставляется. Только на проектах побольше.