目前我编译和链接c++程序是这样的
cl.exe /EHsc main.cpp /link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
看起来很别扭,我试过了
cl.exe /EHsc main.cpp /link /LIBPATH:"D:Windows Kits10Lib10.0.19041.0umx64"
它没有工作。您必须单独指定每个.lib文件。
解决方案吗?
PS:我的示例main.cpp代码
#include <Windows.h>
#include <iostream>
int main()
{
SetCursorPos(1000, 1000);
std::cout << "Hello World!n";
return 0;
}
库名必须在链接器中显式指定。
如果选中链接器选项->在Visual Studio中,你会发现有Marco $(CoreLibraryDependencies);%(AdditionalDependencies)。
你可以在Visual Studio(the tool can be found in Win->Visual Studio folder
)的Developer Powershell中做类似的事情。
$CoreLibraryDependencies=@("kernel32.lib","user32.lib","gdi32.lib","winspool.lib","comdlg32.lib","advapi32.lib","shell32.lib","ole32.lib","oleaut32.lib","uuid.lib","odbc32.lib","odbccp32.lib")
和
cl.exe /EHsc main.cpp /link $CoreLibraryDependencies /LIBPATH:"D:Windows Kits10Lib10.0.19041.0umx64"
当然,也可以将文件夹中的所有库存储到数组中通过powershell脚本。
我找到了一种方法来找到丢失的lib位置。
如果你用cl.exe或clang.exe编译你的代码,如果你有丢失的库,它会显示错误,说"error LNK2019: unresolved external symbol __imp_CLSIDFromString"
然后使用grep搜索"__imp_CLSIDFromString"符号在所有lib文件夹中。
例如:
grep -o --color -a "__imp_CLSIDFromString" /mnt/c/Program Files (x86)/Windows Kits/10/Lib/10.0.22000.0/um/x64/*