G ++ не находит CoInitializeEx (и несколько других функций)? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь скомпилировать следующий код

#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
...