#UNDER_CE - неправильное декорирование имен компилятором
От: dream_cast Россия  
Дата: 09.08.10 11:48
Оценка:
Приветствую!

Дано:
VC2008 + Windows CE 5.0 Standard Software Development Kit (SDK)

Необходимо собрать проект под WinCE 5.0 (x86) (HP Thin Client)

Обнаружил следующую проблему — если определен макрос #define UNDER_CE (а он должен быть определен) и подключен windows.h (а без него тоже никуда) то компилятор неправильно декорирует имена функций.

Например:

extern "C"
int __stdcall MyFunc(int);


вместо ожидаемого: _MyFunc@4

получаю: _MyFunc


если windows.h не подключать то декорирование работает правильно (но это не выход).

В проекте я линкуюсь со сторонней библиотекой, для которой должен обеспечить набор callback'ов. Вот собственно из-за сабжевой проблемы линковщик и ругается на unresolved external symbol.

Сталкивался кто-нибудь с подобной проблемой? Как решали?

P.S: Опыта работы под CE нет совсем.
Re: #UNDER_CE - неправильное декорирование имен компилятором
От: superlexx  
Дата: 09.08.10 17:39
Оценка:
Здравствуйте, dream_cast, Вы писали:
_>__stdcall

не используется в ARM WinCE, т.к. первые несколько параметров всё равно в регистрах передаются и экономии от __stdcall мало.

Чтобы имена подходили, используйте def-файлы.
Re[2]: #UNDER_CE - неправильное декорирование имен компилято
От: dream_cast Россия  
Дата: 09.08.10 17:52
Оценка:
Здравствуйте, superlexx, Вы писали:

S>не используется в ARM WinCE, т.к. первые несколько параметров всё равно в регистрах передаются и экономии от __stdcall мало.

S>Чтобы имена подходили, используйте def-файлы.

У меня x86.
А __stdcall — это требование либы с которой я линкуюсь.
def-файлы не помогут. У меня статическая линковка не проходит. Сами ф-ии экспортировать из dll мне не нужно.


В дополнение про ARM:

Если в качестве целевой платформы выбрать не x86 а ARMV4I то ошибок линковки не возникает. Т.е. формат декорирования имен у компилятора совпадает с форматом в сторонней либе.

Под x86 же получаем рассогласоване форматов декорирования.
Получается, что либо у меня что-то с настройками компиляции, любо сторонняя библиотека под WinCE(x86) собрана неверно.

Стороння библиотека — Citrix Virtual Channel SDK (VCSDK) 10.x

Наверняка на форуме есть знатоки WinCE кто собирал под x86. Как правльно должны декорироваться имена из примера в исходном посте (для WinCE-x86)?
Re[3]: #UNDER_CE - неправильное декорирование имен компилято
От: dream_cast Россия  
Дата: 09.08.10 18:16
Оценка:
Здравствуйте, dream_cast, Вы писали:

_>Как правльно должны декорироваться имена из примера в исходном посте (для WinCE-x86)?


Если верить Format of a C Decorated Name то должно быть:
 _MyFunc@4

что от меня и ожидает библиотека.

Но получаю я:
 _MyFunc


ЧЯДНТ?
Re[4]: #UNDER_CE - неправильное декорирование имен компилято
От: superlexx  
Дата: 09.08.10 21:19
Оценка: 3 (1)
Где-то в Windows-header стоит типа "#define __stdcall __cdecl". Смотрите, от чего это зависит. Если от UNDER_CE, то SDK скорее всего собран криво. Можно попробовать #undef __stdcall на нужном месте.
Re[5]: #UNDER_CE - неправильное декорирование имен компилято
От: dream_cast Россия  
Дата: 10.08.10 11:21
Оценка:
Здравствуйте, superlexx, Вы писали:

S>Где-то в Windows-header стоит типа "#define __stdcall __cdecl". Смотрите, от чего это зависит. Если от UNDER_CE, то SDK скорее всего собран криво. Можно попробовать #undef __stdcall на нужном месте.


Так оно и оказалось.

C:\WINCE500\PUBLIC\COMMON\SDK\INC\windef.h
#ifdef UNDER_CE
#define __stdcall __cdecl    // Note this doesn't match the desktop definition
#define _stdcall __cdecl    // Note this doesn't match the desktop definition
#endif


C:\WINCE500\PUBLIC\COMMON\SDK\INC\rpcproxy.h
#if defined (UNDER_CE)
#define __stdcall __cdecl
#endif


Спасибо за грамотный совет!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.