0

我有适用于 Windows Mobile 6 的应用程序。要构建它,我使用 cegcc (arm-mingw32ce)。现在我有了带有新 SDK 的新设备,并且必须将这个 SDK 中的一些功能添加到这个应用程序中。SDK来了。

头文件.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 /all library.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

我可以在 VS2k5 中使用这个 SDK(需要安装 Windows Mobile SDK...),但是用 cegcc 编译失败。

我试图将它编译并链接为 C 和 Cpp。有和没有 _SOME_FLAG_ 定义(带有此标志集的 C 编译当然在extern "C"上失败)。

结果是:

undefined reference to `foo'

当 C 编译或使用extern "C"编译的 Cpp和

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(只有 main 和简单的 foo 调用)。

看起来有一个重整问题(vc++ vs 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 回答