PDA

Просмотр полной версии : Проблемы с компиляцией сорца под Vs6


Piflit
01.09.2007, 20:31
Есть сорц.
#include <windows.h>

void MyWinMain(void)
{
MessageBox(NULL,"Hello, world",NULL,MB_OK);
ExitProcess(0);
}
В том же архиве, что и сорц (они не мои) лежит бинарник размером 2 кб. При попытке скомпилировать сорц пишет
Compiling...
tinyapp.cpp
Linking...
tinyapp.obj : error LNK2001: unresolved external symbol __chkesp
Debug/TinyApp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

TinyApp.exe - 2 error(s), 0 warning(s)

Если заменить MyWinMain (не знаю, стоит ли это вообще делать) на WinMain выдает
Compiling...
tinyapp.cpp
C:\Tiny\TinyApp\tinyapp.cpp(4) : warning C4007: 'WinMain' : must be '__stdcall'
C:\Tiny\TinyApp\tinyapp.cpp(4) : error C2731: 'WinMain' : function cannot be overloaded
C:\Tiny\TinyApp\tinyapp.cpp(3) : see declaration of 'WinMain'
Error executing cl.exe.

TinyApp.exe - 1 error(s), 1 warning(s)

Я запутался. Вот сорц (http://dssoft.org.ua/Tiny.zip).

!_filin_!
01.09.2007, 20:43
unresolved external symbol __chkesp --- в асме такая ошибка обычно означает что неподключон файл с описанием....

Alexsize
01.09.2007, 20:45
#include <windows.h>
int main(int argc, char* argv[])
{
MessageBox(NULL, "Alexsize forever!", "Nalivai!",MB_OK | MB_ICONQUESTION);
}

Вот он - пример что надо=)

P.S. Если хочешь, чтоб твой заработал - выкинь ExitProcess(0);

З.З.Ы. КЕЗ не ори на мну, лучше в асе ответь=)

da_ff
01.09.2007, 20:46
в первом случае создается новая точка входа в программу вот почитать http://rsdn.ru/article/cpp/crt.xml
во втором не соответствуют параметры функции winmain, почитать можно там же

Piflit
01.09.2007, 20:54
!_filin_!, #include <windows.h> - все подключено, windows.h лежит в инклудах.
Alexsize, та же ошибка(
da_ff, читаю...

KEZ
01.09.2007, 20:55
unresolved external symbol __chkesp --- в асме такая ошибка обычно означает что неподключон файл с описанием....

вы не перестаете меня удивлять, кодеры античата.

tinyapp.obj : error LNK2001: unresolved external symbol __chkesp
Компилер при включенной опции разных чекингов (помоему /Gs) добавляет тебе абсолютно на*** не нужный (почти) код __chkesp, который проверяет стек после каждого вызова. А CRT у тебя отключена в проэкте, поэтому линкуется без нее и ясен *** ф-ии нет нигде. Вырубай либо проверку в настройках проэкта, либо добавь CRT. Делай первое конечно ;)
И поставь сразу main'у __stdcall. Например APIENTRY или WINAPI.

Вот он - пример что надо=)
это нихера не что надо. у него сделан минимальный бинарник, там отключены CRT, и т.п.

Piflit
01.09.2007, 21:10
А CRT у тебя отключена в проэкте, поэтому линкуется без нее и ясен *** ф-ии нет нигде. Вырубай либо проверку в настройках проэкта, либо добавь CRT. Делай первое конечно ;)
И поставь сразу main'у __stdcall. Например APIENTRY или WINAPI.
1) где отключить CRT? пробежал все настройки, не нашел. можно ли писать бОльшие проги (например, блокнот) с отключенным CRT?
2) И поставь сразу main'у __stdcall. Например APIENTRY или WINAPI
void MyWinMain(void) __stdcall {} так? или
void WINAPI MyWinMain(void); ?

Alexsize
01.09.2007, 21:13
альт + F7 - там все найдешь.

Piflit
01.09.2007, 21:18
альт + F7 - там все найдешь.
Я это уже смотрел, но про CRT там ничего нет. Может он называется по-другому? Я в этом пока не разбираюсь(

Alexsize
01.09.2007, 21:26
Грохни вообще все что в Linker окошке. Он все что надо там сам проставит. Пример то простой.

Piflit
01.09.2007, 21:32
Грохни вообще все что в Linker окошке. Он все что надо там сам проставит. Пример то простой.
Compiling...
tinyapp.cpp
Linking...
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
LINK : fatal error LNK1561: entry point must be defined
Error executing link.exe.

TinyApp.exe - 1 error(s), 0 warning(s)
как же тогда определить EP?

Alexsize
01.09.2007, 21:35
=(
_http://slil.ru/24804237

Piflit
01.09.2007, 21:42
=(
_http://slil.ru/24804237
24кб+открывается окно консоли. мда=\

Alexsize
01.09.2007, 21:47
24кб+открывается окно консоли. мда=\
Хех. Делай релиз и читай статью греата по оптимизации в линкере. А то что в консоли... =)

Ni0x
01.09.2007, 22:24
1) int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int) - вин проект или в настройках SUBSYSTEM:WINDOWS, надеюсь разберешься.
2) #pragma comment(linker, "/ENTRY:myEntry") , где myEntry твоя точка входа.
Пишу в неадекватном состоянии, если где ошибься - поправьте.
http://forum.vingrad.ru/topic-38864.html

Piflit
01.09.2007, 23:14
прочел http://rsdn.ru/article/cpp/crt.xml . Необходимо зайти в настройки проекта ("Project" - "Settings"), выбрать нужную Release-конфигурацию и на закладке "C++" удалить опцию препроцессора _ATL_MIN_CRT.
самое смешное, что у меня там нечего отключать, ибо параметра _ATL_MIN_CRT нет=\

Ni0x, 1 пробовал, рез тот же. по поводу второго... подумал и решил вручную точку входа не ставить, просто не знаю, куда.

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

Ni0x
01.09.2007, 23:24
Инструкция:
Win32 Application -> An empty project -> File View -> Source Files -> Add Files To Folders -> создаешь файл с расширением сpp -> далее пишешь в нем:


#include <windows.h>

int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
MessageBox(0,"hello","123", 0);
return 0;
}

F7

Piflit
02.09.2007, 00:26
F7
мде. значит, это уже было. так и должно быть 24 кб? если да, то как в примере сделали 2?
при мах сжатии upx 9.5. но все равно не то=\

GlOFF
02.09.2007, 00:48
Piflit Я думаю это настройки линкера...
в частности попробуй вот так! объеденить все данные в одну секцию у меня раза в два снижает размер :)
#pragma comment(linker,"/FILEALIGN:512 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR /IGNORE:4078")

inv
02.09.2007, 00:54
_http://uinc.ru/articles/28/ там есть исходник
а вообще не вижу смысла........на стадии изучения основ останавливаться на этом

KEZ
02.09.2007, 01:00
> Я это уже смотрел, но про CRT там ничего нет. Может он называется по-другому? Я в этом пока не разбираюсь(

#pragma comment(linker,"/entry:MyWinMain")
#pragma comment(linker,"/nodefaultlib")

void __stdcall MyWinMain( void ) {
...
}

Piflit
02.09.2007, 01:46
Уррря! Я постиг секрет хеккерской линковки!! Всем огромное спасибо! Особенно Kezу))
ЗЫ прикольно, в конце упикс пожал получившийся 16кб файл в 8 раз и получились заветные 2 кб!!! ))))))0
теперь можно спокойно идти спать.......

Ni0x
02.09.2007, 10:51
Ну если у тебя получился файл размером 16кб, значит ты не постиг тайну линковщика =)
Читай информацию по ссылке, которую я дал тебе в одном из своих сообщений.

lexer666
02.09.2007, 16:44
http://uinc.ru/articles/28/

В билдере можно что-то подобное сделать? Пробовал как в статье:
#include <windows.h>
#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:New_WinMain")
#pragma comment(linker,"/NODEFAULTLIB")
void New_WinMain(void) { ExitProcess(0); }
не получается, причем размер пустого проекта достигает 50! кб.

_Great_
02.09.2007, 17:55
lexer666, дебаг билд?

lexer666
02.09.2007, 20:41
В Bcb6 нет же режимов дебаг или релиз. В Vs05 при обоих режимах ошибки.
В Bcb6 можно собрать маленькое приложение, как в статье?

Piflit
02.09.2007, 21:11
lexer666
#include <windows.h>

#pragma comment(linker,"/entry:WinMain")
#pragma comment(linker,"/nodefaultlib")
#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/MERGE:.data=.text")
#pragma comment(linker, "/SECTION:.text,EWRX")
#pragma comment(linker, "/IGNORE:4078")
#pragma comment(linker, "/opt:nowin98")

int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
MessageBox(0,Path_to_WIN,Path_to_SYS, 0);
return 0;
}
у меня VS6. на выходе 1 кб.

GlOFF
02.09.2007, 22:35
на выходе 1 кб. Круто!!!
#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/MERGE:.data=.text")
#pragma comment(linker, "/SECTION:.text,EWRX")
#pragma comment(linker, "/IGNORE:4078")
Кстати расположение данных в одну секцию .text при определенных условиях может у некоторых антивирей (Panda, AntiVir, ещё кто-то) вызывать подозрения.

Ni0x
02.09.2007, 22:57
lexer666, для bcb нужно отключать опции непосредственно в проекте, через pragma comment ты этого не сделаешь.

KEZ
03.09.2007, 02:37
#pragma comment(linker, "/MERGE:.rdata=.text")
#pragma comment(linker, "/MERGE:.data=.text")
#pragma comment(linker, "/SECTION:.text,EWRX")
#pragma comment(linker, "/IGNORE:4078")


Многие считают что это некая просьба вижуал студии "пожалуйста, собери экзешник поменьше".
На самом деле юзать эти прагмы надо с умом, а /ignore:4078 можно вообще выкинуть. Видимо поэтому её и нет в линкерах следующих версий студий.
Если убираете CRT - вырубайте все проверки компилятора, туда ссылающиеся, делайте свой operator new и delete, и т.п. Причем в след. студиях Release сборка почему-то (никто не знает) позволяет создать бинарник меньше (из-за уменьшения выравнивания файла (не путать с секциями), такая опция есть только у линкеров VS6, дальше нету).
Вообщем, может я не тщательно смотрел, но в 7 и 8 студиях ставить релиз необходимо - иначе хер соберется самый маленький бинарник. Странно что они так сделали, по логике Debug и Release - "пресеты" настроек и не должны содержать в себе чего-то, что нельзя поменять через эти настройки.

Ещё насчет оптимизация - как-то уж очень хуево она сделана в студиях 7 и 8. А может и 6 - незнаю.
Ставишь minimize size и компиллер тебе женской логикой выбрасывает из кода всякое, по его мнению "говно", которое не используется или возвращает константу и т.п.

_Great_
03.09.2007, 09:04
http://wasm.ru/forum/viewtopic.php?pid=188444#p188444
тут я уже описывал как что и зачем

KEZ
03.09.2007, 09:19
Грейт не спорь, не отнимай у меня плюсики репутации. все по понятиям. =\