0

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))

どうすればこの問題を解決できますか?何か案は?

4

1 に答える 1

0

問題が解決しました。実行時の動的リンクの可能性を忘れてしまった

#include <windows.h>
#include <winbase.h>
#include <header.h>

HINSTANCE dllinst = NULL;
typedef BOOL (CALLBACK LP_FOO)(DWORD *lpdwParam1, DWORD *lpdwParam2);
static LP_FOO Foo;

dllinst = LoadLibrary("library.dll");
Foo = (LP_FOO) GetProcAddress((HMODULE) dllinst, "foo");

これで、foo と同じように Foo を使用できるようになりました。

于 2012-07-11T09:41:18.997 に答える