Warnung von LINK: was bedeutet das?



  • Hallo

    mein erster Post erstam Hallo 😉

    bin am lernen von C# hab halt die popelige Hello anwendung programmiert
    nach ein paar kleinen änderungen hab ich dann die .exe erstllt und erhielt flgende Warnung:

    LINK : warning LNK4089: Alle Verweise auf 'OLEAUT32.dll' wurden durch /OPT:REF verworfen

    is zwar "nur" eine Warnung aber würde mich interesieren was diese meldung bedeutet

    dange schonmal im voraus

    gruß
    MoDAX

    P.S. ich hoffe ich langweil und unterforder euch nicht mit meinen newbie fragen 😉

    P.P.S. EDIT ups sorry ganz vergessen ich arbveite mit vis studio.NET



  • Hallo,

    was waren es denn für Änderungen? Vielleicht zeigst Du mal etwas Code oder ist es nur Console.WriteLine("Hello ...");. Hast Du die Anwendung vor den Änderungen schon mal ausgeführt?



  • /OPT:REF killt alle Referenzen die nicht referenziert werden :p

    sprich: wenn du /OPT:REF angibst und foo.dll linkst, aber keine Funktion aus foo.dll verwendest - dann wird foo.dll nicht gelinkt. Und genaus das sagt dir der linker.

    Lösung:
    entweder /OPT:REF in /OPT:NOREF umwandeln
    oder
    'OLEAUT32.dll' einfach nicht mitlinken



  • hmm ich hab die oleaut32.dll nicht angegeben beim debugger kommt folgende meldung:

    'Hello.exe': 'C:\Dokumente und Einstellungen\MoDAX\Eigene Dateien\Visual Studio Projects\Hello\Debug\Hello.exe' geladen, Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\ntdll.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\kernel32.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\mfc71d.dll' geladen, Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\msvcr71d.dll' geladen, Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\gdi32.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\user32.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\advapi32.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\rpcrt4.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\shlwapi.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\msvcrt.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\comctl32.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\oleaut32.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\ole32.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\MFC71DEU.DLL' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\Programme\Logitech\MouseWare\system\LgWndHk.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\msctf.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\CTAGENT.DLL' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\Programme\Gemeinsame Dateien\Logitech\Scrolling\LGMSGHK.DLL' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\msvcp60.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\version.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\version.dll' entladen
    'Hello.exe': 'C:\WINDOWS\system32\mslbui.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\Programme\Steganos Security Suite 4\SteganosServiceHook.dll' geladen, Keine Symbole geladen.
    'Hello.exe': 'C:\WINDOWS\system32\winspool.drv' geladen, Keine Symbole geladen.
    Das Programm "[3188] Hello.exe: Systemeigen" wurde mit Code 2 (0x2) beendet.

    und der code zum prog ist dieser:

    // HelloDlg.cpp : Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "Hello.h"
    #include "HelloDlg.h"
    #include ".\hellodlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // CAboutDlg-Dialogfeld für Anwendungsbefehl 'Info'
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialogfelddaten
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    // Implementierung
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    
    // CHelloDlg Dialogfeld
    
    CHelloDlg::CHelloDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CHelloDlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CHelloDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CHelloDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_BN_CLICKED(IDHELLO, OnBnClickedHello)
    	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
    	ON_BN_CLICKED(IDWIRKLICH, OnBnClickedWirklich)
    END_MESSAGE_MAP()
    
    // CHelloDlg Meldungshandler
    
    BOOL CHelloDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
    	// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    
    	// TODO: Hier zusätzliche Initialisierung einfügen
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    void CHelloDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // Wenn Sie dem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie 
    //  den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das 
    //  Dokument/Ansicht-Modell verwenden, wird dies automatisch ausgeführt.z
    
    void CHelloDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext zum Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Symbol in Clientrechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // Die System ruft diese Funktion auf, um den Cursor abzufragen, der angezeigt wird, während der Benutzer
    //  das minimierte Fenster mit der Maus zieht.
    HCURSOR CHelloDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    void CHelloDlg::OnBnClickedHello()
    {
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    	// benutzer begrüssen
    MessageBox("Servus. dies ist meine erste Anwendung","Meine erste Hello Anwendung");
    }
    
    void CHelloDlg::OnBnClickedButton1()
    {
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    	//nicht drücken scherz *g*
    MessageBox("Du Nase ich hab doch gesagt du sollst nicht drücken!!! Mach das nie wieder!!","WARNUNG!!");
    }
    
    void CHelloDlg::OnBnClickedWirklich()
    {
    	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
    	//HAHA
    MessageBox("MUAHAHAHAAAAAAA Du glaubst doch nicht wirklich das das so einfach ist? *g*","Reingelegt!");
    }
    

    kann es sein das die dll mit der stdafx.h angesprochen wird? andererseits wundert mich das nach dem debugger wird aus der betroffenen dll keine symbol geladen aber das ist nicht die einzige aus der nichts geladen wird

    hab auch schn im netz gesucht was die dll für eine da seins berechtigung hat weiß aber lediglich das das eine systemdatei ist bzw im system 32 ordner steckt

    gruß
    MoDAX



  • Die Meldungen sind doch auch logisch. Debugger will Debug-Symbole laden, und dein System hat halt keine Debug Systeme in den Systemkomponenten (es gibt angeblich auch eine Debugversion von Windows, kenn mich da aber nicht aus).

    Welche DLLs er linkt hängt auch von deinem Code ab. Ich bin nicht fit in der MFC (frag da am besten im MFC Forum) - aber ich nehme mal an, dass die MFC diese DLLs braucht.

    Ist es nicht egal wenn der Linker bzw. Debugger solche Meldungen ausgibt? Es sind ja keine Warnungen im eigentlichen Sinne, sondern eher Statusmeldungen...



  • @modax
    Was hat das mit C# zu tun???



  • ups ja sorry C++.NET so ists richtig

    ja die meldungen sind klar aber warum er ausgerechnet die oleaut32 rauskickt wundert mich halt ich frag mal im mfc forum nach

    oder kann der thread evtl verschoben werden?

    gruß
    MoDAX



  • Auch wenn es ein wenig spät kommt. Ich verschieb dich mal da hin



  • VC++ hat festegestellt das du die oleaut32.dll nicht brauchst oder ähnliches. Näheres kann man nur herausfi8nden wenn man sich mit dem Linker beschäftigt.
    Das sie im Moment des Linkens nicht gebraucht wird heißt aber nicht das sie nicht gebrauchst wird. Es kann ja sein das eine andere DLL diese braucht und dies zur Laufzeit nicht gekannt ist.



  • AndreasW schrieb:

    Auch wenn es ein wenig spät kommt. Ich verschieb dich mal da hin

    dange 😉

    @unix-tom

    jo hab mittlerweile rausgefunden das das die optimierung für ein release ist im debug-modus läuft /OPT:NOREF also werden verweise beibehlaten die eigtl das programm gar nciht interessieren bzw. nicht benötigt werden und beim relaese schaltet der linker dann auf /OPT:REF um, um das programm zu optimieren somit werden alle Paketfunktionen rausgeschmissen die für das prog nicht benutzt werden.

    gruß
    MoDAX


Anmelden zum Antworten