GCC 如何使用“@”声明和链接 extern Kernel32.LIB 函数

GCC How declare and link extern Kernel32.LIB functions with '@'

提问人:Sébastien Favier 提问时间:7/24/2016 最后编辑:Michael PetchSébastien Favier 更新时间:8/29/2019 访问量:685

问:

Kernel.LIB 文件内容

_ExitProcess@4、_GetStdHandle@4、_WriteConsoleA@20

  1. 为了使用它,我已经测试声明:

        void WINAPI ExitProcess(unsigned int ExitCode);
        HANDLE WINAPI GetStdHandle(DWORD nStdHandle);
        bool WINAPI WriteConsole@20(HANDLE hConsoleOutput, const void *lpBuffer DWOR......)  
    

    但这行不通。(未定义的引用)。

  2. 我已经用“@n”进行了测试

    void WINAPI ExitProcess@4(unsigned int ExitCode);
    HANDLE WINAPI GetStdHandle@4(DWORD nStdHandle);
    bool WINAPI WriteConsole@20(HANDLE hConsoleOutput, const void *lpBuffer DWOR......)
    

    但这种语法是不允许的。

我在汇编程序中发现了链接到 Kernel32.lib

这个解决方案很好,但仅适用于 nasm 所以,我的问题是:

如何在 C/C++G++/GCC 中使用它?

extern _ExitProcess@4, _GetStdHandle@4, _WriteConsoleA@20

%define ExitProcess _ExitProcess@4
%define GetStdHandle _GetStdHandle@4
%define WriteConsoleA _WriteConsoleA@20

因为“@4 @20”在 C/C++ 中是不允许使用的语法

winapi gcc 编译 g++ 未定义引用

评论

0赞 user4759923 7/24/2016
您必须包括 .然后,未修饰的功能将自动可用。windows.h
0赞 Sébastien Favier 7/26/2016
谢谢,但是当我编译时,我的编译器无法链接符号示例:“undefined reference ExitProcess”,当我使用 CFF 资源管理器编辑我的 OBJ 文件时,我有“ExitProcess”而没有“_ExitProcess@4” 另一个例子,如果我使用“ExitProcessXX”符号名称进行编译,并且使用 CCF 浏览器,我在我的 OBJ 文件中通过“@4”编辑这个“XX”,编译器可以编译......所以。。如何在编译过程中包含这个“@n”?问候

答: 暂无答案