#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» не создается, что приводит к ошибке компоновщика.