Domanda

Sembra che tutta la mia vita da adulto sono stato tormentato dal linker VC ++ che si lamenta o si inciampa perché varie biblioteche non sono d'accordo su quale versione della libreria di runtime utilizzare. Non sono mai dell'umore giusto per padroneggiare quel soggetto triste. Quindi provo solo a scherzare fino a quando non funziona. I messaggi di errore non sono mai utili. Né è la documentazione Microsoft sull'argomento, non almeno per me.

A volte non trova funzioni - perché il nome -mangling non è quello che ci si aspettava? A volte si rifiuta di mescolare e abbinare. Altre volte dice solo, "Link: avvertimento lnk4098: defaultlib 'libcmtd' Conflitti con l'uso di altri libri; use /nodefaultlib: libreria" L'uso di /nodefaultlib non funziona, ma l'avvertimento sembra essere benigno. Che diamine è comunque "defaultlib"? Come decide il linker? Non ho mai visto un modo per specificare al linker quale libreria di runtime utilizzare, solo come dire al compilatore per quale libreria creare richieste di funzione.

Esistono programmi "Dipendency Walker" che possono ispezionare i file degli oggetti per vedere da quali DLL dipendono. Ne ho appena eseguiti uno su un progetto che sto cercando di costruire, ed è un vero casino. Esistono sistemi .libs e .dll che desiderano versioni di runtime in conflitto. Ad esempio, comctl32.dll vuole msvcrt.dll, ma sto collegando msvcrtd.dll. Sto cercando di vedere se c'è un comctl32d.dll, anche se ho digitato.

Quindi immagino che quello che sto chiedendo sia un tutorial su come sistemare quelle cose. Cosa fai e come lo fai?

Ecco cosa penso di sapere. Per favore correggimi se qualcosa di questo è sbagliato.

  1. I parametri sono debug/rilascio, multi-thread/singolo e statico/DLL. Solo sei delle otto possibili combinazioni sono coperte. Non esiste DLL a thread singolo, debug o rilascio.

  2. Le impostazioni influiscono solo su quale libreria di runtime viene collegata (e la convenzione chiamante per collegarsi con esso). Ad esempio, non devi utilizzare un runtime basato su DLL se stai costruendo una DLL, né devi utilizzare una versione di debug di Runtime quando si costruisce la versione di debug di un programma, anche se sembra aiutare quando un singolo- superando le chiamate di sistema.

Domanda bonus: come potrebbe qualcuno o qualsiasi azienda creare un tale casino?

È stato utile?

Soluzione

Questo sembra un po 'come cercare di trovare una risposta alla domanda sbagliata, e / o reinventare la ruota.PHP farà il tuo controllo per te quando getta un errore irreversibile.

Se vuoi guardarlo in questo modo, il tuo codice funziona già.Ottieni un errore irreversibile, quindi la classe genitore non esiste, quindi è necessario correggere il codice.Avendo stabilito che manca una categoria madre, cos'altro hai intenzione di fare?Hai ancora bisogno di aggiustarlo.

Quello che sto cercando di dire è che se sei riuscito a sbarazzarti dell'errore irreversibile, non ti porta da nessuna parte - il tuo codice è ancora difettoso, e probabilmente si schianta da qualche parte più in fondo alla linea.Certo, potresti echeggiare "hai un problema" all'utente, ma questo è ciò che Php lo fa già.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top