Я пытаюсь скомпилировать следующий код
#include <iostream>
#include <windows.h>
#include <objbase.h>
int main (int argc, char** argv) {
HRESULT hr;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (SUCCEEDED(hr)) {
std::cout << "Initialized" << std::endl;
} else {
std::cout << "Failed" << std::endl;
}
CoUninitialize();
return 0;
}
но
g++ -o test -L"<dir>" -lOle32 <file>.cpp
# <dir> contains Ole32.Lib
всегда говорит мне, что __imp_CoInitializeEx
и __imp_CoUninitialize
не определены и -print-file-name=Ole32.Lib
просто возвращают Ole32.Lib
. Если g ++ не находит Ole32.Lib, возможно
g++ -c -o test.o <file>.cpp
ld -L"<dir>" -lOle32 -o test test.o
работает. Теперь g ++ / ld фактически находит CoInitializeEx и CoUninitialize, но стандартная библиотека, похоже, отсутствует, и добавление -static-libstdc++
или -lstdc++
или -llibstdc++
тоже не помогает. Так чего мне не хватает? Почему g ++ не может найти CoInitializeEx и CoUninitialize?
РЕДАКТИРОВАТЬ: Я могу определенно сказать, что нет ничего плохого в моем коде, моих заголовочных файлах и моих библиотеках, потому что я могу скомпилировать код с помощью компилятора Visual Studios:
cl /c /EHsc ^
/I"<...>\Microsoft Visual Studio 14.0\VC\include" ^
/I"<...>\Windows Kits\10\Include\<version>\ucrt" ^
/I"<...>\Windows Kits\10\Include\<version>\shared" ^
/I"<...>\Windows Kits\10\Include\<version>\um" ^
/Fotest.obj ^
main.cpp
link /nologo /machine:x64 /subsystem:console ^
/libpath:"<...>\Microsoft Visual Studio 14.0\VC\lib\amd64" ^
/libpath:"<...>\Windows Kits\10\Lib\<version>\ucrt\x64" ^
/libpath:"<...>\Windows Kits\10\Lib\<version>\um\x64" ^
/out:test.exe ^
test.obj Ole32.Lib