我试图testing如果标准库(kernel32.dll)有一个function。
testing代码片段:
extern void CreateProcessA (void); int main (void) { CreateProcessA (); return 0; }
代码编译和链接如下:
cl /c test.c link test.obj kernel32.lib
这个代码可以用Visual C ++编译,但不能链接:
test.obj : error LNK2019: unresolved external symbol _CreateProcessA referenced in function _main
但是函数CreateProcessA确实存在于kernel32.dll中,你没有?
如何正确链接?
PS我不想运行这个代码,只是检查该函数存在(如果代码编译和链接 – function存在)。
要查看功能是否存在,请使用
dumpbin /exports kernel32.dll | findstr CreateProcess
你甚至没有使用正确的原型,所以链接器当然找不到正确的功能。 命名约定是完全关闭的,CreateProcess实际上是一个宏(根据UNICODE
扩展到CreateProcessA
或W
)。
(你不需要明确地链接到kernel32.lib
,因为cl.exe
默认已经完成了)
不要自己声明原型, #include <windows.h>
。
coreel32.dll导出函数为“CreateProcessA”,请注意缺少的前导下划线。 说服连接器使用该导出的唯一方法是链接kernel32.lib,一个由Windows SDK提供的导入库。
然后你会遇到下一个问题,导入库声明导出为_CreateProcess@40
。 这是__stdcall调用约定所应用的名称装饰。 这个调用约定是明确的设计来捕捉你的错误,你没有正确地声明函数。 名称的@ 40部分表示堆栈帧中传递参数所需的字节数。
所以,为了使它工作,您应该#include <windows.h>
来获得正确的函数声明,并链接到kernel32.lib以获得正确的导出名称。
现在你正在声明你自己的CreateProcess()版本。 由于您没有提供正文(代码),链接器不知道在哪里查找要执行的函数。
为了从kernel32.lib调用CreateProcess,你需要包含正确的头文件
#include <windows.h>
如果编译器不知道windows.h然后可能平台SDK for Windows安装不正确。
您还需要链接到正确的lib
#pragma comment(lib, "kernel32.lib")
你还应该阅读关于createprocess的文档,因为它需要大量的参数
BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, __inout_opt LPTSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCTSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation );
你应该搜索整个interwebs的CreateProcess例子,也许考虑切换到C ++,因为你在Windows上
对于初学者来说,把一个适当的头文件放在原型<windows.h>
,因为这是一个Windows源代码,请为你的链接器添加kernel32.lib ,删除原型,因为它是不正确的。 你的main
功能在你是创建一个命令行程序还是一个windows程序方面是有争议的 – 如果是后者,应该是“ WinMain ”。
如果您在MSDN中查看函数“ CreateProcess ”,向下滚动,您将看到“Library”,这是提示您需要链接哪个库才能正常工作的提示。
希望这有助于,最好的问候,汤姆。
我认为这是一个坏主意,但如果你想这样做,你需要链接到kernel32.lib导出库。
你必须包含windows.h
才能得到正确的原型:
#include <windows.h> int main (void) { CreateProcess(); // will cause warning due to incorrect parameter list return 0; }
有没有特别的原因,你不想包含windows.h
?
使用MinGW可以使用“-mwindows”标志。 例:
gcc.exe -c -g -MMD -MP -MF build/Debug/MinGW-Windows/newmain.od -o build/Debug/MinGW-Windows/newmain.o newmain.c gcc.exe -o dist/Debug/MinGW-Windows/hwprint_dll build/Debug/MinGW-Windows/newmain.o -mwindows
这将包括像gdi32.a,kernel32.a,user32.a和ws2_32.a的东西。