2008-11-06 12 views
1

J'essaie d'utiliser l'API Windows native avec Qt en utilisant le jeu d'outils mingw. Il y a des problèmes de liaison avec certaines fonctions. Ce qui se produit? Est-ce un bug avec mingw nom mangling?Problème de lien de l'API Windows natif sur Qt + win32 + mingw

#ifdef Q_WS_WIN 
    HWND hwnd = QWidget::winId(); 
    HDC hdcEMF = CreateEnhMetaFile(NULL, NULL, NULL, NULL) ; 
    Rectangle(hdcEMF,100,100,200,200); 
    HENHMETAFILE hemf = CloseEnhMetaFile(hdcEMF); 
    OpenClipboard(hwnd); 
    EmptyClipboard(); 
    SetClipboardData(CF_ENHMETAFILE,hemf); 
    CloseClipboard(); 
#else

Les erreurs:

undefined reference to `CreateEnhMetaFileW @ 16'

undefined reference to` Rectangle @ 20'

undefined reference to `CloseEnhMetaFile @ 4'

Répondre

4

Les fonctions CreateEnhMetaFileW() et CloseEnhMetaFile() sont définies dans la bibliothèque statique Gdi32.lib, vous devez donc vous assurer de lier agai C'est ça. Essayez d'ajouter -lgdi32 à la fin de votre ligne de commande que vous utilisez pour compiler. Si cela ne fonctionne pas, vous devrez peut-être spécifier le chemin d'accès complet à Gdi32.lib en ajoutant -L/path/to/folder/containing/the/library -lgdi32 à la place.

0

Il est possible que les fonctions soient incluses, mais elles sont endommagées en raison de l'hypothèse C++.

Examinez la déclaration C {} externe. Il est prévu de déclarer les fonctions qui ne doivent pas être mutilées pour tenir compte du polymorphisme/surcharge. (IE deux fonctions avec le même nom).

2

Si vous voulez utiliser l'API Windows dans une application Qt alors il n'y a pas besoin de déclarer des fonctions WinAPI extern « C », il suffit d'inclure:

#include <qt_windows.h> 

Dans votre fichier de projet (.pro) ajouter les bibliothèques vous utilisation:

LIBS += -luser32 -lshell32 -lgdi32 
0

@torn votre solution a fonctionné pour moi.

Je voulais utiliser un appel api win32 dans mon application qt.

#include #include votre-win32-api-header

et enfin le LIBS + = nom -llibrary.

Notez que vous devrez peut-être donner aussi -L pour les bons chemins.

+0

Ceci ne devrait pas être une réponse, juste un commentaire sur la réponse de @ torn. –