我有适用于 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))
我怎么解决这个问题?有任何想法吗?