Показать полную графическую версию : Ошибки в процессе компиляции.
Interceptor
18-10-2004, 02:56
Нужна помощь.
После того, как прочел первый урок:
http://fox-toolkit.by.ru/tut1.html
- скачал листинги программы: mywindow.cpp, mywindow.h.
И попытался скомпилировать это дело с помощью Dev-C++.
У меня возникло множество ошибок такого типа:
[Linker error] undefined reference to `FX::FXMetaClass::search(unsigned) const'
[Linker error] undefined reference to `FX::FXMainWindow::handle(FX::FXObject*, unsigned, void*)'
...
C:\Program Files\Dev-Cpp\Projects\Test\12\Makefile.win [Build Error] [Project2.exe] Error 1
Был бы очень благодарен, если бы кто-то подсказал, в чём тут может быть проблема.
А правильно ли прописаны пути к библиотекам?
Для Linux это указано внизу страницы
-L$FOX_PREFIX/lib -L/usr/X11R6/lib, может, что-то подобное надо указать для Винды?
Добавлено:
Конкретно, вот эта часть
-L$FOX_PREFIX/lib указывает, где лежат библиотеки FOX. $FOX_PREFIX - префикс, переменная типа $PATH в Delphi, ИМХО, должна получать свое значение при установке FOX.
В общем-то сабж.
Есть чудесные строчки кода по уменьшению выходного файла при компиляции в С++.
Без никаких нареканий компилятся в Visual C++ из VS6
#pragma comment(linker,"/MERGE:.rdata=.text")
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWRX /IGNORE:4078")
#pragma comment(linker,"/ENTRY:main")
В Visual C++ 2008 Express Edition возникают сложности.
Почитав MSDN
"/SECTION":
'E' - Execute ("The section is executable").
'W' - Write ("Allows write operations on data").
'R' - Read ("Allows read operations on data").
'X' - Memory-resident ("VxD only; marks the section as memory-resident"). >> (http://msdn.microsoft.com/en-us/library/ms856031.aspx)
убираю Х, меняю /SECTION:.text,EWRX на /SECTION:.text,EWR.
После этого удаётся их скормить и новейшему компилятору от МикроСофт.
Тем не менее, он их воспринимает с предупреждениями
main.obj : warning LNK4229: invalid directive '/FILEALIGN:512' encountered; ignored
main.obj : warning LNK4229: invalid directive '/IGNORE:4078' encountered; ignored
и выдаёт ЕХЕ несколько больше чем компилятор из далёкого 1998года.
Сейчас не проверял, но помнится компилятор 2003го тоже адекватно воспринимал строчки кода, как и 1998 и даёт ехе несколько меньше. Насчёт 2005го не знаю.
В новой редакции MSDN замены им не было найдено (http://msdn.microsoft.com/en-us/library/ms856733.aspx). Какие необходимо дать эквиваленты директивы взамен '/FILEALIGN:512' и '/IGNORE:4078'? Или есть строчки поколения 2008, которые фантастически уменьшают размер проги?
Указанные выше строки времён 1998го года.
Покопался в MSDN 6.0 т.е 1998 г. - там вообще в справке нету упоминаний о директивах /IGNORE и /FILEALIGN (хотел посмотреть что они делают) Недокументированные какие-то директивы :)
Ты указываешь конфигурацию рилиз или дебаг? Попробуй билдить на конфе рилиз. Build -> Configuration Manager : Release
#include <windows.h>
#pragma comment(linker,"/ENTRY:NWinMain")
void NWinMain(void)
{
MessageBoxW(0, (LPCWSTR) "Hello, Windows" , (LPCWSTR)"hid", NULL);
}
Вот эта программа весит 3584. Много?
Если еще твои строчки добавить получается ~3000 .
Project -> Properties -> Linker: Manifest File
Generate Manifest -> No
Generate Debug Info -> No
В результате 2048
при компиле в 6-ой весит 1536
mrcnn, спасибо за ответ.
Конечно же сиё работает только при компиляции в RELEASE. В DEBUG даже VC++ 6 будет ругаться.
Строчки почерпнул с этой статьи (http://www.xakep.ru/magazine/xa/048/087/2.asp).
Это ведь частный случай, программа на одну строчку. И хотелось разобраться что б строчки и современным компилятором воспринимались. Не документированные, что ж значит и в современном компиляторе есть аналоги. Как видно функциональность от этих строк вовсе не зависит, так что не стоит боятся о труднопереносимости кода между компиляторами.
Кстати мой мин вариант 1024 байта на VC++ 6, кстати кто хочет ещё меньше можно использовать /opt:nowin98, уменьшив правда скорость загрузки в память, что на современных компах не заметно, но опять же в VC++ 6 работает, а в VC++ 2008 игнорируется. Меньше уже наверное только ассемблеру под силу. Слышал что рабочий ехе можно скомпилить в 34 байта!
Я об этих строчках узнал отсюда http://uinc.ru/articles/28/
Date: 15/01/2002
Там прога не на одну строчку.
В проге для DOS - Размер заголовка 1Ch. Так что 34 байта, наверное, реально получить. Windows в принципе должна поддерживать программы для DOS.
В формате PE (PortableExecutables) подразумевается, что размер заголовка составит f8h со смещения 40h (Итого 312 - это минимум) Смещение 40h для совместимости DOS приложений. Таблица секций размера 2Ch (44) Итого 356. Ниже уже вряд ли..
Итого 312 - это минимум »
Я тоже напутал с 34 байтами. Я нашёл ту статью (http://www.xakep.ru/post/21399/default.asp?print=1) - 153 байта миниму в РЕ формате. Но там уже чисто Ассемблер. Причём прога даже в Досе запускается с требованием большей памяти, как утверждает автор.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.