以下是我的课本中尝试创建顺序访问文件的示例。但是,当我尝试编译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
答案 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社区):
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 项目文件丢失了我的源文件,从而导致了这个错误。