c++ - referencia - error lnk2001 símbolo externo sin resolver
error LNK2019: símbolo externo sin resolver_se hace referencia en la función___tmainCRTStartup (11)
¿Implementaste la función main()
?
int main(int argc, char **argv) {
... code ...
return 0;
}
[editar]
Tiene su main()
en otro archivo fuente, por lo que probablemente haya olvidado agregarlo a su proyecto.
Para agregar un archivo fuente existente: en el Explorador de soluciones , haga clic con el botón derecho en la carpeta Archivos de origen , seleccione Agregar y haga clic en Artículo existente . Ahora seleccione el archivo fuente que contiene el main()
No sé lo que está mal. No puedo encontrar dónde está el error. Comentar la implementación tampoco resuelve el error.
Archivo de cabecera
#ifndef MAIN_SAVITCH_SEQUENCE_H
#define MAIN_SAVITCH_SEQUENCE_H
#include <cstdlib> // Provides size_t
namespace main_savitch_3
{
class sequence
{
public:
// TYPEDEFS and MEMBER CONSTANTS
typedef double value_type;
typedef std::size_t size_type;
static const size_type CAPACITY = 30;
// CONSTRUCTOR
sequence( );
// MODIFICATION MEMBER FUNCTIONS
void start( );
void advance( );
void insert(const value_type& entry);
void attach(const value_type& entry);
void remove_current( );
// CONSTANT MEMBER FUNCTIONS
size_type size( ) const;
bool is_item( ) const;
value_type current( ) const;
private:
value_type data[CAPACITY];
size_type used;
size_type current_index;
};
}
#endif
Fuente
#include "sequence1.h"
#include <assert.h>
namespace main_savitch_3
{
// Default constructer - sequence is empty
sequence::sequence()
{
used = current_index = 0;
}
// Start the iteration
void sequence::start()
{
current_index = 0;
}
// Iterate
void sequence::advance()
{
current_index++;
}
// Number of items in the sequence
sequence::size_type sequence::size() const
{
return used;
}
// Checks if there is a current item
bool sequence::is_item() const
{
return current_index <= used && used > 0;
}
// Returns the current value
sequence::value_type sequence::current() const
{
assert(is_item()); // no current item
return data[current_index];
}
// Adds an item BEFORE the current index
void sequence::insert(const value_type& entry)
{
assert(entry != 0); // pointer is invalid
assert(current_index < sequence::CAPACITY); // no room to add an item
// move items up - starting with the last item and working down to the current item
// arrays start at 0, so the -1 adjusts it
for (size_type i = used - 1; i >= current_index; i--)
data[i + 1] = data[i];
data[current_index] = entry;
}
// Adds an item AFTER the current index
void sequence::attach(const value_type& entry)
{
assert(entry != 0); // pointer is invalid
assert(current_index < sequence::CAPACITY); // no room to add an item
// move items up - starting with the last item and working down to the current item
// arrays start at 0, so the -1 adjusts it
for (size_type i = used - 1; i > current_index; i--)
data[i + 1] = data[i];
if (current_index = 0)
data[used] = entry;
else
data[current_index + 1] = entry;
}
// Removes the current item
void sequence::remove_current()
{
for (size_type i = current_index; i < used; i++)
data[i] = data[i + 1];
}
}
En caso de que alguien haya olvidado lo obvio; Tenga en cuenta que si crea una aplicación GUI y utiliza
" -subsystem: windows " en el link-args, la entrada de la aplicación es WinMain @ 16 . No es main () . Por lo tanto, puede usar este fragmento para llamar a su main () :
#include <stdlib.h>
#include <windows.h>
#ifdef __GNUC__
#define _stdcall __attribute__((stdcall))
#endif
int _stdcall
WinMain (struct HINSTANCE__ *hInstance,
struct HINSTANCE__ *hPrevInstance,
char *lpszCmdLine,
int nCmdShow)
{
return main (__argc, __argv);
}
Encontré el error LNK2019 mientras trabajaba en un proyecto DLL en Visual Studio 2013.
Agregué una nueva configuración al proyecto. Pero en lugar de tener el "Tipo de configuración" como "Biblioteca dinámica", Visual Studio lo agregó como "Aplicación". Esto produjo el error LNK2019.
Se corrigió el error LNK2019 yendo a Proyecto -> Propiedades -> Propiedades de configuración -> General y cambiando "Tipo de configuración" a "Biblioteca dinámica (.dll)" y "Extensión de destino" a ".dll".
Sí, la pregunta original habla sobre una consola / proyecto de aplicación, que es un problema diferente de mi respuesta. Pero creo que agregar esta respuesta podría ayudar a alguien (como yo) que tropieza con este hilo.
Incluso si su proyecto tiene un método main()
, el vinculador a veces se confunde. Puede resolver este problema en Visual Studio 2010 yendo a
Proyecto -> Propiedades -> Propiedades de configuración -> Enlazador -> Sistema
y cambiando SubSystem
a Console.
Necesita una función main()
para que el programa sepa por dónde empezar.
Parece que no tiene ninguna función principal, que se supone que es el punto de entrada para su programa.
Si está usando Visual Studio. La razón por la que podría estar recibiendo este error puede deberse a que originalmente creó un nuevo archivo de encabezado.h y luego lo renombró a file.cpp donde colocó su función main ().
Para solucionar el problema, haga clic derecho en file.cpp -> haga clic en Propiedades ir a
Propiedades de configuración -> General -> Tipo de elemento y cambie su valor al compilador C / C ++ en lugar del encabezado C / C ++.
También tuvimos este problema. Mi colega encontró una solución. Resultó ser una redefinición de "principal" en un encabezado de biblioteca de terceros:
#define main SDL_main
Entonces la solución fue agregar:
#undef main
antes de nuestra función principal.
¡Esto es claramente una estupidez!
Tuve este problema a pesar de:
- tener un
main()
; y - configurando todos los otros proyectos en mi solución para que sean bibliotecas estáticas.
Mi posible solución fue la siguiente:
- mi
main()
estaba en un espacio de nombres, por lo que efectivamente se llamósomething::main()
... eliminar este espacio de nombres solucionó el problema.
si tiene la función _tmain
en sus proyectos, debe include <tchar.h>.
vaya a "Proyecto-Propiedades-Propiedades de configuración-Enlazador-entrada-dependencias adicionales", luego vaya al final y escriba "; ws2_32.lib".