Recibo este error, pero no sé cómo solucionarlo.
Estoy usando Visual Studio 2013. Hice el nombre de la solución MyProjectTest Esta es la estructura de mi solución de prueba:
- función.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;
}
Soy un principiante; este es un programa simple y se ejecuta sin errores. Leí en Internet y me interesé en la prueba unitaria, así que creé un proyecto de prueba:
Archivo> Nuevo> Proyecto ...> Instalado> Plantillas> Visual C ++> Prueba> Proyecto de prueba de unidad nativa>
Nombre: UnitTest1 Solución: Agregar a la solución Luego, la ubicación cambió automáticamente a la ruta de la solución abierta actual Esta es la estructura de carpetas de la solución:
Solo edité el archivo 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
}
};
}
Pero obtengo el error LNK2019: símbolo externo sin resolver. Sé que falta la implementación de la función múltiple . Intenté eliminar el archivo function.cpp y reemplacé la declaración con la definición, y se ejecutó. Pero no se recomienda escribir tanto la declaración como la definición en el mismo archivo. ¿Cómo puedo solucionar este error sin hacer eso? ¿Debo reemplazar con #include "../MyProjectTest/function.cpp"
en el archivo unittest.cpp?
(No soy muy bueno en inglés. Gracias)
fuente
.LIB
extensión de archivo. Para complicar las cosas ... las bibliotecas de enlaces dinámicos (es decir*.DLL
) pueden tener una biblioteca de importación adjunta que también tiene una.LIB
extensión de archivo. Esta biblioteca de importación enumera todos los beneficios proporcionados por*.DLL
. Para obtener más información, lea: Guía para principiantes deRespuestas:
Una opción sería incluirla
function.cpp
en suUnitTest1
proyecto, pero puede que esa no sea la estructura de solución más ideal. La respuesta corta a su problema es que al construir suUnitTest1
proyecto, el compilador y el enlazador no tienen idea de quefunction.cpp
existe, y tampoco tienen nada para vincular que contenga una definición demultiple
. Una forma de solucionar este problema es utilizar bibliotecas de enlace.Dado que sus pruebas unitarias están en un proyecto diferente, supongo que su intención es hacer de ese proyecto un programa independiente de pruebas unitarias. Con las funciones que está probando ubicadas en otro proyecto, es posible construir ese proyecto en una biblioteca vinculada dinámica o estáticamente. Las bibliotecas estáticas están vinculadas a otros programas en el momento de la compilación y tienen la extensión
.lib
, y las bibliotecas dinámicas están vinculadas en tiempo de ejecución y tienen la extensión.dll
. Para mi respuesta, preferiré bibliotecas estáticas.Puede convertir su primer programa en una biblioteca estática cambiándolo en las propiedades del proyecto. Debería haber una opción en la pestaña General donde el proyecto está configurado para compilarse en un ejecutable (
.exe
). Puede cambiar esto a.lib
. El.lib
archivo se creará en el mismo lugar que el.exe
.En su
UnitTest1
proyecto, puede ir a sus propiedades y, en la pestaña Vinculador, en la categoría Directorios de biblioteca adicionales, agregue la ruta a la que seMyProjectTest
compila. Luego, para Dependencias adicionales en el Vinculador - pestaña Entrada, agregue el nombre de su biblioteca estática, muy probablementeMyProjectTest.lib
.Eso debería permitir que su proyecto se desarrolle. Tenga en cuenta que al hacer esto,
MyProjectTest
no será un programa ejecutable independiente a menos que cambie sus propiedades de compilación según sea necesario, lo que sería menos que ideal.fuente
En el árbol de soluciones de Visual Studio, haga clic con el botón derecho en el proyecto 'UnitTest1' y luego en Agregar -> Elemento existente -> elija el archivo ../MyProjectTest/function.cpp
fuente
Como quiero que mi proyecto se compile en un EXE independiente, vinculé el proyecto UnitTest al archivo function.obj generado a partir de function.cpp y funciona. Haga clic con el botón derecho en el proyecto 'UnitTest1'> Propiedades de configuración> Vinculador> Entrada> Dependencias adicionales> agregar ".. \ MyProjectTest \ Debug \ function.obj"
fuente
Me encontré con este problema en Visual Studio 2013. Aparentemente ahora, tener dos proyectos en la misma solución y configurar las dependencias no es suficiente. Debe agregar una referencia de proyecto entre ellos. Para hacer eso:
fuente
resultó que estaba usando archivos .c con archivos .cpp. cambiar el nombre de .c a .cpp resolvió mi problema.
fuente
Otra forma en que puede obtener este error del vinculador (como yo) es si está exportando una instancia de una clase desde un dll pero no ha declarado esa clase en sí como importación / exportación.
Entonces, aunque principalmente estaba exportando solo una instancia de la clase Book llamada
book
anteriormente, tuve que declarar laBook
clase como clase de exportación / importación y, de lo contrario, llamarbook.WordCount()
a la otra dll estaba causando un error de enlace.fuente
Esto me sucedió, así que pensé en compartir mi solución, tan simple como era:
Compruebe el conjunto de caracteres de ambos proyectos en Propiedades de configuración -> General -> Conjunto de caracteres
Mi proyecto UnitTest estaba usando el conjunto de caracteres predeterminado Multi-Byte mientras que mis bibliotecas estaban en Unicode .
Mi función estaba usando un TCHAR como parámetro. Como resultado, en mi lib mi TCHAR se transformó en un WCHAR pero era un char * en mi UnitTest: el símbolo era diferente porque los parámetros en realidad no eran los mismos al final.
fuente
Acabo de descubrir que
LNK2019
ocurre durante la compilación en Visual Studio 2015 si me olvido de proporcionar una definición para una función declarada dentro de una clase.El error del vinculador fue muy críptico, pero reduje lo que faltaba leyendo el error y proporcioné la definición fuera de la clase para aclararlo.
fuente
en mi caso, establezca el archivo cpp en "C / C ++ compiler" en la propiedad -> general resolver el error LNK2019.
fuente
Para mí funciona, si añado esta línea de abajo en
.vcxproj
enitemGroup
archivo CPP, que está conectado al archivo de cabecera.fuente
En Visual Studio 2017, si desea probar miembros públicos, simplemente coloque su proyecto real y el proyecto de prueba en la misma solución, y agregue una referencia a su proyecto real en el proyecto de prueba.
Consulte Pruebas unitarias de C ++ en Visual Studio en el blog de MSDN para obtener más detalles. También puede verificar Escribir pruebas unitarias para C / C ++ en Visual Studio , así como Usar el Marco de pruebas unitarias de Microsoft para C ++ en Visual Studio , este último si necesita probar miembros no públicos y necesita poner las pruebas en el mismo proyecto como su código real.
Tenga en cuenta que las cosas que desee probar deberán exportarse mediante
__declspec(dllexport)
. Consulte Exportar desde una DLL con __declspec (dllexport) para obtener más detalles.fuente