Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Ошибки в процессе компиляции. (http://forum.oszone.net/showthread.php?t=29371)

Interceptor 18-10-2004 02:56 203595

Нужна помощь.
После того, как прочел первый урок:
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

Был бы очень благодарен, если бы кто-то подсказал, в чём тут может быть проблема.

[mzd] 19-10-2004 08:18 203596

А правильно ли прописаны пути к библиотекам?
Для Linux это указано внизу страницы
Код:

-L$FOX_PREFIX/lib -L/usr/X11R6/lib
, может, что-то подобное надо указать для Винды?

Добавлено:

Конкретно, вот эта часть
Код:

-L$FOX_PREFIX/lib
указывает, где лежат библиотеки FOX. $FOX_PREFIX - префикс, переменная типа $PATH в Delphi, ИМХО, должна получать свое значение при установке FOX.  

Admiral 24-05-2008 15:33 809869

В общем-то сабж.
Есть чудесные строчки кода по уменьшению выходного файла при компиляции в С++.
Без никаких нареканий компилятся в 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 (Specify Section Attributes)
"/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"). >>

убираю Х, меняю /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 замены им не было найдено. Какие необходимо дать эквиваленты директивы взамен '/FILEALIGN:512' и '/IGNORE:4078'? Или есть строчки поколения 2008, которые фантастически уменьшают размер проги?
Указанные выше строки времён 1998го года.

mrcnn 25-05-2008 20:31 810530

Покопался в 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

Admiral 25-05-2008 21:07 810545

mrcnn, спасибо за ответ.
Конечно же сиё работает только при компиляции в RELEASE. В DEBUG даже VC++ 6 будет ругаться.
Строчки почерпнул с этой статьи.
Это ведь частный случай, программа на одну строчку. И хотелось разобраться что б строчки и современным компилятором воспринимались. Не документированные, что ж значит и в современном компиляторе есть аналоги. Как видно функциональность от этих строк вовсе не зависит, так что не стоит боятся о труднопереносимости кода между компиляторами.

Кстати мой мин вариант 1024 байта на VC++ 6, кстати кто хочет ещё меньше можно использовать /opt:nowin98, уменьшив правда скорость загрузки в память, что на современных компах не заметно, но опять же в VC++ 6 работает, а в VC++ 2008 игнорируется. Меньше уже наверное только ассемблеру под силу. Слышал что рабочий ехе можно скомпилить в 34 байта!

mrcnn 26-05-2008 07:18 810777


Я об этих строчках узнал отсюда http://uinc.ru/articles/28/
Date: 15/01/2002

Там прога не на одну строчку.

В проге для DOS - Размер заголовка 1Ch. Так что 34 байта, наверное, реально получить. Windows в принципе должна поддерживать программы для DOS.

В формате PE (PortableExecutables) подразумевается, что размер заголовка составит f8h со смещения 40h (Итого 312 - это минимум) Смещение 40h для совместимости DOS приложений. Таблица секций размера 2Ch (44) Итого 356. Ниже уже вряд ли..



Admiral 26-05-2008 12:08 810930

Цитата:

Цитата mrcnn
Итого 312 - это минимум »

Я тоже напутал с 34 байтами. Я нашёл ту статью - 153 байта миниму в РЕ формате. Но там уже чисто Ассемблер. Причём прога даже в Досе запускается с требованием большей памяти, как утверждает автор.


Время: 05:47.

Время: 05:47.
© OSzone.net 2001-