MSVCRTD.lib(crtexe.obj):错误LNK2019:函数___tmainCRTStartup中引用了未解析的外部符号_main

时间:2014-12-09 01:49:49

标签: c lnk2019

以下是我的课本中尝试创建顺序访问文件的示例。但是,当我尝试编译VS2008时,我仍然收到此错误:

MSVCRTD.lib(crtexe.obj):错误LNK2019:函数___ tmainCRTStartup中引用了未解析的外部符号_main。

有什么想法吗?

提前致谢!

#include <stdio.h>

int main( void )
{ 
   unsigned int account; // account number
   char name[ 30 ]; // account name
   double balance; // account balance

   FILE *cfPtr; // cfPtr = clients.dat file pointer   

   // fopen opens file. Exit program if unable to create file 
   if ( ( cfPtr = fopen( "clients.dat", "w" ) ) == NULL ) {
      puts( "File could not be opened" );
   } // end if
   else { 
      puts( "Enter the account, name, and balance." );
      puts( "Enter EOF to end input." );
      printf( "%s", "? " );
      scanf( "%d%29s%lf", &account, name, &balance );

      // write account, name and balance into file with fprintf
      while ( !feof( stdin ) ) { 
         fprintf( cfPtr, "%d %s %.2f\n", account, name, balance );
         printf( "%s", "? " );
         scanf( "%d%29s%lf", &account, name, &balance );
      } // end while

      fclose( cfPtr ); // fclose closes file   
   } // end else
} // end main

3 个答案:

答案 0 :(得分:1)

好的 - 您的程序应该编译并链接而不会出现错误,您无需执行任何特殊操作。换句话说,你不应该&#34; #include windows.h&#34; (虽然它不会受到伤害)你不应该明确地使用&#34; tmain()&#34; (即使它是MSVC宏后面的实际条目)。

它应该&#34;只是工作&#34;。

SUGGESTIONS:

1)确认您可以编译,链接和执行 ANY C程序。例如:

a)输入此程序:       notepad tmp.c

#include <stdio.h>

int main() {
  printf ("Hello world!\n");
  return 0;
}

b)编译:从MSVS IDE或命令行(您可以使用MSVS .bat文件&#34; vcvars32.bat&#34;来设置命令提示符环境:

d:\temp>cl tmp.c
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.50727.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

tmp.c
Microsoft (R) Incremental Linker Version 11.00.50727.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:tmp.exe
tmp.obj

c:执行您的计划:D:\temp>tmp 你好世界!

2)我有一个不同的,更新版本的MSVS ...但它应该对你的MSVS 2008绝对有效。

3)如果你的&#34;你好世界&#34; (新的MSVS项目和/或命令行构建)因相同的链接错误而失败,您可能需要考虑重新安装MSVS。如果可能的话,请考虑获取更新版本(例如Visual Studio 2013社区):

http://www.visualstudio.com/

MSVS 2012 Express

4)如果你的'#hello world&#34;工作(应该),考虑从头开始创建一个新项目,然后将文件复制到新项目中。

这个完整的示例为我编译并运行正常:

#include <stdio.h>
#include <string.h>

#define MAX_NAME 30
#define MAX_LINE 80
#define CLIENTS_FILE "clients.dat"

int main () { 
   char line[MAX_LINE], acct_name[MAX_NAME];
   unsigned int acct_no;
   double acct_balance;
   int iret;

   /* Open file.  Print error and return non-zero status if error */
   FILE *fp = fopen(CLIENTS_FILE, "w" );
   if (!fp) {
      perror ("clients file open error");
      return 1;
   } 

   do {
     /* Get next record */
     printf ("Enter the account, name, and balance. \"q\" to exit.\n");
     fgets (line, MAX_LINE, stdin);

     /* Check for end of data */
     if (line[0] == 'q')
       break;

     /* Parse data */
     if ((iret = sscanf(line, "%d %s %lf", &acct_no, acct_name, &acct_balance )) == 3) {
       /* Write to file */
       fprintf(fp, "%d %s %lf\n", acct_no, acct_name, acct_balance );
     } else {
       /* Print warning */
       printf ("Error: unable to parse input: #/items parsed = %d, line = %s", iret, line);
     }

    } while (line[0] != 'q');

    /* Close file and return "OK" status */
    fclose (fp);
    printf ("Done.\n");
    return 0;
}

答案 1 :(得分:1)

我正在使用 Visual Studio 2017 并收到该错误。对我来说,解决方案是:

主菜单 -> 项目 -> 项目名称 - 属性。

那么:

链接器->系统和右侧的“子系统”我选择了“Windows”。之后我的代码得到了完美的编译。

答案 2 :(得分:0)

双重签入 vs 项目,源文件包含包含项目主要功能的源文件。对我来说,我的 cmake 文件中的一个错误导致生成的 vs 项目文件丢失了我的源文件,从而导致了这个错误。