При первом использовании PCH, ошибка Linker Tool

Я довольно начинающий программист, немного изучаю c, но я всегда делал это на Linux с помощью gcc и Vim, но решил попробовать использовать visual studio, и у меня появляются ошибки LNK2005 и LNK1169, я пытался найти ошибки и как их исправить и правильно использовать PCH, потому что я думаю, что было бы полезно учиться, даже если мои программы слишком малы, чтобы использовать его.

Из моего понимания мне нужно #include "stdafx.h" в верхней части моего исходного файла (называетсяhelloworld.c«Я не коснулся»stdafx.c«По умолчанию, который пришел при создании проекта, я создал заголовочный файл с именем»bitwise.h«и он имеет одну функцию под названием»int bw()«Я тогда есть»stdafx.hи все, что я добавил, было #include "bitwise.h" В моем заголовкеbitwise.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

0

Решение

Это не так много о PCH. Вы перепутали файлы заголовков (.h) и реализации (.c). Что вам нужно сделать, это разделить реализацию и объявление. Вы должны сделать следующее:

  1. переименуй свой bitwise.h в bitwise.c так как это ваш файл реализации, а не заголовок!

  2. создать новый файл bitwise.h и поместите туда только объявление, оно должно выглядеть так:

    #pragma once
    
    int bw();
    

Ваш проект должен быть в состоянии скомпилировать после этого.

Также обратите внимание, что файл PCH должен содержать включения, которые редко меняются, что, вероятно, не ваш случай, так как вы включаете также bitwise.h, Вы можете удалить это включение из stdafx.h и включить его в свой helloworld.c,

И просто примечание, во время обучения C не делайте подумайте о включении .c файла через #include! Если это исправит некоторые ваши ошибки компиляции, ваш проект проекта, вероятно, очень неправильно.

0

Другие решения

Nitpick: Вам не нужно включать #include stdafx.h в bitwise.h, хотя он все равно должен иметь #pragma один раз.

Ваш код для bw() должен по-прежнему находиться в отдельном файле bitwise.c, а не в заголовке. Я думаю, что вы можете путать скомпилированные заголовки с встраиванием функций? Прямо сейчас, ваш код для bw компилируется в то, что должно быть фиктивным объектом stdafx, и снова в главном объекте, и вызывает конфликт при компоновке.

Кроме того, вы помните, чтобы пометить ваш stdafx.h как предварительно скомпилированный заголовок (/ Yu), а stdafx.cpp как … что бы ни означало / Yc? Убедитесь, что оба параметра установлены для всех конфигураций проекта для оба файла в Свойствах -> C / C ++ -> Скомпилированные заголовки.

0

По вопросам рекламы [email protected]