c++ - risolti - lnk2019 unresolved external symbol




Come risolvere l'errore LNK2019: simbolo esterno non risolto-funzione? (7)

è risultato che stavo usando i file .c con i file .cpp. rinominare .c in .cpp ha risolto il mio problema.

Ho ricevuto questo errore, ma non so come risolverlo.

Sto usando Visual Studio 2013. Ho creato la soluzione nome MyProjectTest Questa è la struttura della mia soluzione di test:

- function.h

#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

int multiple(int x, int y);
#endif

-function.cpp

#include "function.h"

int multiple(int x, int y){
    return x*y;
}

- main.cpp

#include <iostream>
#include <cstdlib>
#include "function.h"
using namespace std;

int main(){
    int a, b;
    cin >> a >> b;
    cout << multiple(a, b) << endl;

    system("pause");
    return 0;
}

Sono un principiante; questo è un programma semplice e funziona senza errori. Ho letto su internet e mi sono interessato al test unitario, quindi ho creato un progetto di test:

File> Nuovo> Progetto ...> Installato> Modelli> Visual C ++> Test> Progetto test unità nativa>

Nome: UnitTest1 Soluzione: Aggiungi alla soluzione Quindi la posizione passa automaticamente al percorso della soluzione aperta corrente Questa è la struttura della cartella della soluzione:

Ho solo editato il file unittest1.cpp:

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../MyProjectTest/function.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{       
    TEST_CLASS(UnitTest1)
    {
    public:

        TEST_METHOD(TestEqual)
        {

            Assert::AreEqual(multiple(2, 3), 6);
            // TODO: Your test code here
        }

    };
}

Ma ottengo l'errore LNK2019: simbolo esterno non risolto. So che manca l'implementazione della funzione multipla . Ho provato a cancellare il file function.cpp e ho sostituito la dichiarazione con la definizione, e l'ho eseguita. Ma non è consigliabile scrivere sia la dichiarazione che la definizione nello stesso file. Come posso risolvere questo errore senza farlo? Devo sostituire con #include "../MyProjectTest/function.cpp" nel file unittest.cpp? (Non sono molto bravo in inglese. Grazie)


Ho appena avuto questo problema in Visual Studio 2013. A quanto pare ora, avere due progetti nella stessa soluzione e impostare le dipendenze non è sufficiente. È necessario aggiungere un riferimento al progetto tra di loro. Fare quello:

  1. Esplora il progetto con il tasto destro del mouse
  2. Fai clic su Aggiungi => Riferimenti ...
  3. Fai clic sul pulsante Aggiungi nuovo riferimento
  4. Seleziona le caselle per i progetti su cui si basa questo progetto
  5. Clicca OK

In Visual Studio 2017 se si desidera testare i membri pubblici, è sufficiente inserire il progetto reale e il progetto di test nella stessa soluzione e aggiungere un riferimento al progetto reale nel progetto di test.

Vedere Test dell'unità C ++ in Visual Studio dal blog MSDN per ulteriori dettagli. Puoi anche controllare i test delle unità di scrittura per C / C ++ in Visual Studio e utilizzare il Microsoft Test Framework per C ++ in Visual Studio , quest'ultimo se devi testare i membri non pubblici e devi mettere i test nello stesso progetto come il tuo vero codice.

Nota che le cose che vuoi testare dovranno essere esportate usando __declspec(dllexport) . Vedi Esportare da una DLL Usando __declspec (dllexport) per maggiori dettagli.


Mi è successo così ho pensato di condividere la mia soluzione, per quanto semplice:

Controlla il set di caratteri di entrambi i progetti in Proprietà di configurazione -> Generale -> Set di caratteri

Il mio progetto UnitTest utilizzava il set di caratteri predefinito Multi-Byte mentre le mie librerie erano in Unicode .
La mia funzione utilizzava un TCHAR come parametro. Come risultato nella mia lib, il mio TCHAR è stato trasformato in un WCHAR ma era un char * sul mio UnitTest: il simbolo era diverso perché i parametri non erano davvero gli stessi alla fine.


Per me funziona, se aggiungo questa riga qui sotto in .vcxproj nel file .vcxproj itemGroup , che è collegato al file di intestazione.

<ClCompile Include="file.cpp" />

Poiché desidero che il mio progetto venga compilato su un file EXE autonomo, ho collegato il progetto UnitTest al file function.obj generato da function.cpp e funziona. Fare clic con il tasto destro sul progetto 'UnitTest1'> Proprietà di configurazione> Linker> Input> Dipendenze aggiuntive> aggiungere ".. \ MyProjectTest \ Debug \ function.obj"


Un'opzione consisterebbe nell'includere function.cpp nel progetto UnitTest1 , ma potrebbe non essere la struttura di soluzione ideale. La risposta breve al tuo problema è che quando costruisci il tuo progetto UnitTest1 , il compilatore e il linker non hanno idea che function.cpp esista e che non abbia nulla da collegare che contenga una definizione di multiple . Un modo per risolvere questo problema è fare uso di librerie di collegamento.

Dato che i tuoi test unitari sono in un progetto diverso, presumo che la tua intenzione sia quella di rendere quel progetto un programma indipendente di test delle unità. Con le funzioni che stai testando situate in un altro progetto, è possibile creare quel progetto in una libreria collegata dinamicamente o staticamente. Le librerie statiche sono collegate ad altri programmi in fase di compilazione e hanno l'estensione .lib e le librerie dinamiche sono collegate in fase di esecuzione e hanno l'estensione .dll . Per la mia risposta preferisco le librerie statiche.

È possibile trasformare il primo programma in una libreria statica modificandolo nelle proprietà del progetto. Ci dovrebbe essere un'opzione nella scheda Generale in cui il progetto è impostato per creare un eseguibile ( .exe ). Puoi cambiarlo in .lib . Il file .lib verrà creato nello stesso posto di .exe .

Nel progetto UnitTest1 , è possibile UnitTest1 alle relative proprietà e, nella scheda Linker nella categoria Directory di libreria aggiuntive, aggiungere il percorso a cui MyProjectTest basa. Quindi, per Dipendenze aggiuntive sotto la scheda Linker - Input, aggiungi il nome della tua libreria statica, molto probabilmente MyProjectTest.lib .

Questo dovrebbe consentire al tuo progetto di costruire. Si noti che, facendo ciò, MyProjectTest non sarà un programma eseguibile autonomo a meno che non si cambino le sue proprietà di creazione in base alle esigenze, il che sarebbe meno che ideale.







lnk2019