第一次使用 PCH,出现 Linker Tool Error
First Time Using PCH, getting Linker Tool Error
我是一个相当新手的程序员,只学了一点 c,但我总是在 Linux 上用 gcc 和 Vim 做,但决定尝试使用 visual studio我遇到了 LNK2005 和 LNK1169 错误,我尝试查找错误以及如何修复它们并正确使用 PCH,因为我认为即使我的程序太小而无法使用它,学习它也会很有用。
根据我的理解,我需要 #include "stdafx.h"
在我的源文件的顶部(称为“helloworld.c
”)我没有触及默认的“stdafx.c
”当我创建项目时,我创建了一个名为“bitwise.h
”的 header 文件,其中有一个名为“int bw()
”的函数,然后我有“stdafx.h
”和所有我添加的是 #include "bitwise.h"
在我的 headerbitwise.h
我试图包括 #include "stdafx.h" #include "stdafx.c" #include <stdio.h>
甚至不包括任何东西。所有这些都破坏了我的程序。我可以让它编译的唯一方法是如果我注释掉//bw();
然后我的程序编译就好了。
以下是我认为可能是罪魁祸首的文件:
helloworld.c
#include "stdafx.h"
int main()
{
printf("\tHello World!\n");
getchar();
bw(); //If this line is commented out everything works just Honky-Dory
getchar();
return 0;
}
bitwise.h
#include "stdafx.h" //I've tried lots of diffrent lines here, nothing works
int bw()
{
int a = 1;
int x;
for (x = 0; x < 7; x++)
{
printf("\nNumber is Shifted By %i Bits: %i", x, a << x);
}
getchar();
return 0;
}
stdafx.c
// stdafx.cpp : source file that includes just the standard includes
// $safeprojectname$.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
stdafx.h
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#include "bitwise.h"
#include <stdio.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here
吹毛求疵:您不需要在 bitwise.h 中 #include stdafx.h,尽管它仍然应该有一个 #pragma once。
您的 bw()
代码仍应位于单独的 bitwise.c 文件中,而不是 header 中。我认为您可能将预编译 header 与函数内联混淆了?现在,您的 bw
代码正在被编译到应该是虚拟 stdafx object 的代码中,并再次编译到主 object 中,并在链接时造成冲突。
此外,您是否记得将 stdafx.h 标记为预编译的 header (/Yu),并将 stdafx.cpp 标记为... /Yc 应该是什么意思?确保在 Properties -> C/C++ -> Precompiled Headers.
中为 both files 的所有项目配置设置了两个选项
关于 PCH 的内容不多。您混淆了 header (.h) 和实现 (.c) 文件。您需要做的是拆分实现和声明。您应该执行以下操作:
将您的 bitwise.h
重命名为 bitwise.c
因为这是您的实施文件,而不是 header!
创建一个新文件bitwise.h
并只在其中放置声明,它应该如下所示:
#pragma once
int bw();
之后你的项目应该可以编译了。
另请注意,PCH 文件应包含不经常更改的包含项,这可能不是您的情况,因为您还包含 bitwise.h
。您可能希望从 stdafx.h
中删除此包含并将其包含到您的 helloworld.c
.
顺便说一句,在学习 C 的过程中不要 考虑通过 #include
包含 .c 文件!如果它修复了你的一些编译错误,你的项目设计可能是非常错误的。
我是一个相当新手的程序员,只学了一点 c,但我总是在 Linux 上用 gcc 和 Vim 做,但决定尝试使用 visual studio我遇到了 LNK2005 和 LNK1169 错误,我尝试查找错误以及如何修复它们并正确使用 PCH,因为我认为即使我的程序太小而无法使用它,学习它也会很有用。
根据我的理解,我需要 #include "stdafx.h"
在我的源文件的顶部(称为“helloworld.c
”)我没有触及默认的“stdafx.c
”当我创建项目时,我创建了一个名为“bitwise.h
”的 header 文件,其中有一个名为“int bw()
”的函数,然后我有“stdafx.h
”和所有我添加的是 #include "bitwise.h"
在我的 headerbitwise.h
我试图包括 #include "stdafx.h" #include "stdafx.c" #include <stdio.h>
甚至不包括任何东西。所有这些都破坏了我的程序。我可以让它编译的唯一方法是如果我注释掉//bw();
然后我的程序编译就好了。
以下是我认为可能是罪魁祸首的文件:
helloworld.c
#include "stdafx.h"
int main()
{
printf("\tHello World!\n");
getchar();
bw(); //If this line is commented out everything works just Honky-Dory
getchar();
return 0;
}
bitwise.h
#include "stdafx.h" //I've tried lots of diffrent lines here, nothing works
int bw()
{
int a = 1;
int x;
for (x = 0; x < 7; x++)
{
printf("\nNumber is Shifted By %i Bits: %i", x, a << x);
}
getchar();
return 0;
}
stdafx.c
// stdafx.cpp : source file that includes just the standard includes
// $safeprojectname$.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
stdafx.h
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#include "bitwise.h"
#include <stdio.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here
吹毛求疵:您不需要在 bitwise.h 中 #include stdafx.h,尽管它仍然应该有一个 #pragma once。
您的 bw()
代码仍应位于单独的 bitwise.c 文件中,而不是 header 中。我认为您可能将预编译 header 与函数内联混淆了?现在,您的 bw
代码正在被编译到应该是虚拟 stdafx object 的代码中,并再次编译到主 object 中,并在链接时造成冲突。
此外,您是否记得将 stdafx.h 标记为预编译的 header (/Yu),并将 stdafx.cpp 标记为... /Yc 应该是什么意思?确保在 Properties -> C/C++ -> Precompiled Headers.
中为 both files 的所有项目配置设置了两个选项关于 PCH 的内容不多。您混淆了 header (.h) 和实现 (.c) 文件。您需要做的是拆分实现和声明。您应该执行以下操作:
将您的
bitwise.h
重命名为bitwise.c
因为这是您的实施文件,而不是 header!创建一个新文件
bitwise.h
并只在其中放置声明,它应该如下所示:#pragma once int bw();
之后你的项目应该可以编译了。
另请注意,PCH 文件应包含不经常更改的包含项,这可能不是您的情况,因为您还包含 bitwise.h
。您可能希望从 stdafx.h
中删除此包含并将其包含到您的 helloworld.c
.
顺便说一句,在学习 C 的过程中不要 考虑通过 #include
包含 .c 文件!如果它修复了你的一些编译错误,你的项目设计可能是非常错误的。