В общем, после нескольких умо- и телодвижений (пальцами разумеется), успешно скомпилил серверную дллку последним релизом MinGW (за декабрь 2012, вроде бы 4.7). Исправил вызовы тчинков (аналогично адаптации под 2005 и более старшие студии), заигнорил надоедливые варнинги, статически прилинковал libgcc и libstdc++, чтобы не таскать их вместе с дллкой, сделал с горем пополам экспорт GiveFnptrsToDll.
Дллка собирается и без проблем просматривается Dependency Walker'ом. Что странно: при сборке студией экспорт GiveFnptrsToDll находится первым в списке, а при сборке MinGW - пятым, перед ним засовываются CreateInterface, DelayedUse, GetEntityAPI, GetEntityAPI2. Названия функций тчинков имеют другой формат:
студия:
C++ Source Code:
?SwingAgain@CCrowbar@@QAEXXZ
MinGW:
C++ Source Code:
_ZN8CCrowbar10SwingAgainEv
и количество их отличается, некоторые есть только в MinGW версии, а некоторые только в MSVC. Критично ли это? Спрашиваю потому, что халфа давится дллкой на начальном этапе загрузки и крэшится, ксаш тоже.
Ещё одно: т.к. было лень разбираться (да я толком и не знаю, как их исправить) с ассемблерными вставками в common/mathlib.h, я закомментил
C++ Source Code:
void__inline set_fpu_cw(void)
int__inline quick_ftol(float f)
void__inline restore_fpu_cw(void)
и заюзал таковые для не-windows платформы:
C++ Source Code:
#define set_fpu_cw() /* */
#define quick_ftol(f) ftol(f)
#define restore_fpu_cw() /* */
Кто-нибудь подскажет, что я изломал? А может версия компилятора не подходит, и нужна древняя 2.95, в которой не будет варнингов? Или в опциях компилятора указать нужный стандарт кода?
Ku2zoff писал: при сборке студией экспорт GiveFnptrsToDll находится первым в списке, а при сборке MinGW - пятым
Очевидно же, что твой MinGW игнорирует hl.def
Этот файл не просто так в папке лежит.
Цитата:
Ku2zoff писал: Спрашиваю потому, что халфа давится дллкой на начальном этапе загрузки и крэшится
А кто тебе сказал, что халфа прожуёт дллку, скомпиленную MinGW? Там, например, совсем другой механизм декорирования имён экспортов (да ты это и сам заметил).
Добавлено 30-04-2013 в 22:26:
Цитата:
Ku2zoff писал: А может версия компилятора не подходит, и нужна древняя 2.95
Для линуксового выделенного сервера - да, именно древняя, так как там древний глибц, а с новым будет бинарная несовместимость. Винду, славабогу, писали не упоротые линуксоиды, поэтому под виндой такого говнища как "бинарная несовместимость" нет.
Добавлено 30-04-2013 в 22:27:
Цитата:
Ku2zoff писал: Критично ли это?
Для сингла - да, для мультиплеера - нет.
Добавлено 30-04-2013 в 22:28:
Цитата:
Ku2zoff писал: заигнорил надоедливые варнинги
Там только один надоедливый варнинг, про invalid-offsetof, остальные можно и нужно исправлять.
Ага. В аттач приложил. Скомпилена в дебаге, довольно жирная (почти 4 мб).
Цитата:
XaeroX писал: Там только один надоедливый варнинг, про invalid-offsetof, остальные можно и нужно исправлять.
Вот спасибо, теперь хоть знаю, какие нужно исправлять.
Цитата:
XaeroX писал: Очевидно же, что твой MinGW игнорирует hl.def
Я добавил линкеру ключ --def mp.def, правда он ругался на синтаксическую ошибку в файле, поэтому пришлось оставить в нём (файле) только EXPORTS, а SECTIONS удалить, похоже MinGW это дело не понимает. И сдаётся мне, что ему вообще пофигу на этот def файл, экспортит сам как хочет.
Цитата:
Дядя Миша писал: Они пустые тащем-то. Зачем ты закоментил пустые функции?
Та не-не-не. Там вот как:
C++ Source Code:
1
void__inline set_fpu_cw(void)
2
{
3
_asm
4
{ wait
5
fnstcw old_cw
6
wait
7
mov ax, word ptr old_cw
8
or ah, 0xc
9
mov word ptr new_cw,ax
10
fldcw new_cw
11
}
12
}
13
14
int__inline quick_ftol(float f)
15
{
16
_asm {
17
// Assumes that we are already in chop mode, and only need a 32-bit int
18
fld DWORD PTR f
19
fistp DWORD PTR dlong
20
}
21
return dlong.i[0];
22
}
23
24
void__inline restore_fpu_cw(void)
25
{
26
_asm fldcw old_cw
27
}
код на ассемблере (юзается при компиляции под виндой), на который ругается компилятор. Собственно толком ничего не нашёл по этому поводу для MinGW, поэтому поступил по-простому: заменил эти функции пустыми:
C++ Source Code:
#define set_fpu_cw() /* */
#define quick_ftol(f) ftol(f)
#define restore_fpu_cw() /* */
для не-виндовс.
Вложение: mp.7z.001.zip (500.0 кб)
Этот файл был скачан 192 раз.
Т.к. аттач, чёрт возьми не всеядный, пришлось дописать архивам расширение zip, чтобы не подавился
Второй кусок архива:
Добавлено 01-05-2013 в 00:25:
Цитата:
fire64 писал: Ku2zoff, глянь исходники ксаша под линукс, которые я портировал.
У меня там сервер скомпилен нормально и под HLDS Linux успешно грузится.
У меня тащем-то проблема с виндовой дллкой, а не с линуксовой сошкой. Я тут на досуге глядел макефайлы для разных исходников, ни в одном не нашёл упоминания о def-файлах. Как происходит экспорт GiveFnptrsToDll в линуксе?
Добавлено 01-05-2013 в 00:27:
Цитата:
XaeroX писал: Там, например, совсем другой механизм декорирования имён экспортов
То есть, если я соберу сингловую дллку с другими именами экспортов, сингл будет глючить? Я так понимаю, что сейв/рестор в особенности. А есть вариант этот механизм подменить?
Вложение: mp.7z.002.zip (199.0 кб)
Этот файл был скачан 505 раз.
Кстати вспомнил. Учти один важный момент.
GiveFnptrsToDll объявлен как __stdcall
ни в коем случае не переопределяй его как __cdecl
вот как раз и будет такой вылет.