LNK 2019 при компиляции main.c

#c

Вопрос:

Я всего лишь новичок в C и Visual Studio, и у меня есть эта странная ошибка. Я объявил функцию в cipher.h и определил ее в cipher.c (я включил шифр.h в шифре.c). Я включаю шифр.h в main.c и использовал функцию. Но это дает мне эту ошибку при компиляции main.c:

 unresolved external symbol test_encrypt referenced in function _main  

Вот коды:

шифр.h:

 #pragma once #include lt;stdio.hgt; #include lt;stdbool.hgt;  void test_encrypt(char message[]);  

шифр.c:

 #include "cipher.h"  void test_encrypt(char message[]) {  message[0] = '0'; }  

главная.c:

 #include lt;stdio.hgt; #include "cipher.h"  int main(void) {  // open a text file and read the text into an array called buffer  // the text is "54321"  test_encrypt(buffer);  printf(buffer); }  

Все работает нормально, если я удалю строку, в которой используется функция test_encrypt. Заранее спасибо.

Комментарии:

1. Это проблема компоновщика, скорее всего, потому cipher.c , что он не скомпилирован с вашим кодом. Убедитесь, что вы компилируете cipher.c вместе с main.c .

2. И buffer переменная не определена, по крайней мере, в вашем примере кода.

3. использование: cl main.c cipher.c . Добавьте аргументы компилятора, такие как -I и так далее, как вы уже сделали. Покажите свою команду компилятора в следующий раз в вопросе.

4. cl main.c шифр.c работает! Большое вам спасибо!

Ответ №1:

Подумайте об этапах компиляции C.

Первые источники C встроены в объекты. Это скомпилированные файлы, которые являются строительными блоками вашего конечного исполняемого файла. Когда вы вызываете cipher свой main, компилятор просматривает включенные заголовки и смотрит, не найдет ли он что-нибудь, что ему соответствует. Поскольку вы определили прототип функции, компилятор знает, что такая функция где-то существует, но на данном этапе он не знает, где именно.

Объект main.o будет иметь ссылку на cipher объявленный как «внешний». После этого этапа компиляции задача компоновщика-убедиться, что символы, которые у вас есть, где-то есть. Отсюда он ищет либо в других объектных файлах, либо в некоторых библиотеках, и если он нигде не может его найти, он выдает ошибку, которую вы видите.

Что я могу себе представить, так это то, что вы не указали «cipher.c» как часть вашего проекта VS, следовательно, «cipher.o» не создается, что приводит к ошибке компоновщика.