Windows Mobile 6用のアプリケーションがあります。それを構築するには、cegcc(arm-mingw32ce)を使用します。これで、新しいSDKを備えた新しいデバイスができました。このSDKの一部の機能をこのアプリケーションに追加する必要があります。これがSDKです。
header.h
#ifndef _HEADER_H_
#define _HEADER_H_
#include <windows.h>
#ifndef _SOME_FLAG_
extern "C"
{
#endif
BOOL foo(DWORD *lpdwParam1, DWORD *lpdwParam2);
#ifndef _SOME_FLAG_
}
#endif
#endif
library.lib(これはおそらくVC ++でコンパイルされたインポートライブラリであり、デバイスにlibrary.dllがあります)
「dumpbin/alllibrary.lib」からの出力
2DA0 ?foo@@YAHPAK0@Z
2DA0 __imp_?foo@@YAHPAK0@Z
Archive member name at 2DA0: library.dll/
correct header end
Version : 0
Machine : 1C2 (Thumb)
SizeOfData : 0000002B
DLL name : library.dll
Symbol name : ?foo@@YAHPAK0@Z (int __cdecl foo(unsigned long *,unsigned long *))
Type : code
Name type : undecorate
Hint : 14
Name : foo
このSDKをVS2k5で使用することはできますが(Windows Mobile SDKのインストールが必要でした...)、cegccでのコンパイルは失敗します。
私はそれをCとCppとしてコンパイルしてリンクしようとしていました。_SOME_FLAG_が定義されている場合とされていない場合(もちろん、このフラグが設定されたCコンパイルはextern "C"で失敗します)。
結果は次のとおりです。
undefined reference to `foo'
Cがコンパイルされたとき、またはCppがextern"C"でコンパイルされたとき
undefined reference to `foo(unsigned long*, unsigned long*)'
Cppがextern"C"なしでコンパイルされた場合。
コンパイル:
gcc -O2 -Wall -Wextra -pedantic -Wno-long-long -g -c -DUNICODE -D_UNICODE -Ic:\inc sample.c
リンク:
gcc -static -mconsole -o sample obj\sample.o -lc:\lib\library.lib -laygshell
Cppをコンパイルするときは、sample.cをsample.cppに変更するだけです(単純なfoo呼び出しでのみmainがあります)。
マングリングの問題があるようです(vc ++とgcc)。追加__attribute__((dllimport))
してみました__attribute__((cdecl))
どうすればこの問題を解決できますか?何か案は?