错误LNK2019:函数___tmainCRTStartup中引用了未解析的外部符号_main

时间:2011-01-30 20:43:40

标签: c++ linker

我不知道它有什么问题。我找不到错误的位置,注释掉实现并没有解决错误。

标题文件

#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

来源

#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];
    }

}

14 个答案:

答案 0 :(得分:68)

即使您的项目采用main()方法,链接器有时也会感到困惑。您可以通过转到

在Visual Studio 2010中解决此问题
  

项目 - &gt;属性 - &gt;配置属性 - &gt;链接器 - &gt;系统

并将SubSystem更改为控制台。

答案 1 :(得分:35)

我们也有这个问题。我的同事找到了解决方案。它变成了对第三方库标题中“main”的重新定义:

#define main    SDL_main

所以解决方案是添加:

#undef main

在我们的主要功能之前。

这显然是愚蠢的!

答案 2 :(得分:22)

如果您的项目中有_tmain功能,则需要include <tchar.h>.

答案 3 :(得分:16)

您需要main()功能,以便程序知道从哪里开始。

答案 4 :(得分:9)

如果有人错过了显而易见的事;请注意,如果您构建GUI应用程序并使用
link-args中的“ -subsystem:windows ”,应用程序条目是 WinMain @ 16 。不是主()。因此,您可以使用此代码段来调用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);
}

答案 5 :(得分:6)

您是否实施了main()功能?

int main(int argc, char **argv) {
    ... code ...
    return 0;
}

<强> [编辑]

您在另一个源文件中有main(),因此您可能忘记将其添加到项目中。

添加现有源文件:在解决方案资源管理器中,右键单击源文件文件夹,指向添加,然后单击“确定”。 现有项目。现在选择包含main()

的源文件

答案 6 :(得分:4)

如果您使用的是Visual Studio。您可能收到此错误的原因可能是因为您最初创建了一个新的头文件.h然后将其重命名为file.cpp,您放置了main()函数。

要解决此问题,请右键单击file.cpp - &gt;单击属性 去 配置属性 - &gt;常规 - &gt;项目类型并将其值更改为 C / C ++编译器而不是C / C ++头。

答案 7 :(得分:3)

尽管我遇到了这个问题:

  • 拥有main();和
  • 将我的解决方案中的所有其他项目配置为静态库。

我的最终解决方案如下:

  • 我的main()位于命名空间中,因此被有效地称为something::main() ...删除此命名空间可以解决问题。

答案 8 :(得分:2)

我在Visual Studio 2013中处理DLL项目时遇到了LNK2019错误。

我在项目中添加了一个新配置。但是Visual Studio没有将“配置类型”作为“动态库”,而是将其添加为“应用程序”。 这导致了LNK2019错误。

通过转到Project - &gt;修复了LNK2019错误。属性 - &gt;配置属性 - &gt;一般并将“配置类型”更改为“动态库(.dll)”和“目标扩展”为“.dll”。

是的,最初的问题是关于控制台/应用程序项目,这是一个与我的答案不同的问题。但我相信添加这个答案可能会帮助某人(像我一样)偶然发现这个问题。

答案 9 :(得分:1)

在 Visual Studio 中,项目属性,用于 x86、x64、发布和调试配置

链接器 > 系统 > 子系统

对于 /SUBSYSTEM:WINDOWS 需要以下主要内容(注意这是针对 unicode、宽字符版本):

#include <Windows.h>

int WINAPI  wWinMain(_In_ HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPWSTR    lpCmdLine,
    int       nCmdShow)
{
   return 0;
}

对于 /SUBSYSTEM:CONSOLE 需要以下主要内容:

int main(int argc, char* argv[], char* environment[]){
      return 0;
}

答案 10 :(得分:0)

您似乎没有主要功能,它应该是您程序的入口点。

答案 11 :(得分:0)

我的问题是别的
我在一个没有实现的类中有一个方法。
像这样:

class Hello {
    public:
        // ...
        void PrintHelloWorld();
        // ...
};

当我调用该方法时出现错误:

hello().PrintHelloWorld();
<块引用>

错误:LNK2019 未解析的外部符号“public: void __thiscall Hello::PrintHelloWorld(void)” (?PrintHelloWorld@Hello@@QAEXXZ) 在函数 _main demo 中引用。\Peyman\source\repos\demo\demo\demo。对象 1

事实上,我使用了一个没有实现的 SDK,它会导致错误。 请检查是否有任何实施。 void PrintHelloWorld(){} 带括号

答案 12 :(得分:-2)

转到“项目 - 属性 - 配置属性 - 链接器 - 输入 - 附加依赖项”,然后转到结尾并键入“; ws2_32.lib”。

答案 13 :(得分:-2)

尝试使用return 0;

如果仍然失败,请将您的解决方案平台更改为64x而不是86x 并转到配置管理器(即您将86x更改为64x) 并将其设置为64位

对我有用,希望对您有用