[英]Implicit Declaration Of Function
我只是通過使用標頭來組織代碼,但是正如我這樣做時,我得到一個警告,鏈接時變成了錯誤。
我在test.c
中有一個代碼(使用標頭中的函數),如下所示:
#include "test1.h"
/* Some code */
main()
{
Testing();
}
我的test1.h
標頭是這樣的:
void Testing();
void print(int, int, int, const char*);
並在test1.c
void Testing()
{
print(0xF9, 27, 5, "\xC9\\xBB");
}
void print(int colour, int x, int y, const char *string)
{
volatile char *video=(volatile char*)0xB8000 + y*160 + x*2;
while(*string != 0)
{
*video=*string;
string++;
video++;
*video=colour;
video++;
}
}
當我嘗試編譯代碼時,我得到了:
ubuntu @ eeepc:〜/ Development / Test $ gcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
test.c:在函數“ main”中:
test.c:11:警告:函數“測試”的隱式聲明
ubuntu @ eeepc:〜/開發/測試$
當時這只是一個簡單的警告,但是當我嘗試鏈接它時...
ubuntu @ eeepc:〜/ Development / Test $ ld -T linker.ld -o kernel.bin loader.o test.o
test.o:在函數main':
test.c:(.text+0xfc): undefined reference tomain':
test.c:(.text+0xfc): undefined reference tomain':
Testing的
test.c:(.text+0xfc): undefined reference tomain':
test.c:(.text+0xfc): undefined reference to
我需要做什么?
編輯:為了反映OP的問題,盡管遭到了投票支持,但我還是刪除了一些答案...
為什么即使在此未提及kernel.c,在編譯器中也將其標記出來?
我錯過了什么嗎?
\ngcc -o test.o -c test.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs\nkernel.c:在函數“ main”中:\nkernel.c:11:警告:函數“測試”的隱式聲明\nubuntu @ eeepc:〜/開發/測試$\n
也許您需要在頭文件中的某處執行此操作,因為我正在判斷您是否希望內核訪問此功能:
extern void Testing();
並且,取出所有功能並將它們放置在單獨的.c文件中,它們不應該放在第一位...例如:
Testing.c /* all your functions here */ Testing.h /* Only global, external variables and function prototypes */
希望這對您有所幫助,湯姆,謝謝。
我無法重提您的問題。 當我嘗試在Ubuntu機器上編譯您的代碼時,這可以按預期工作(根據您的粘貼,我假設您正在使用。)
您確定#include正確執行嗎?
嘗試使用-E而不是-c來查看編譯器試圖編譯的整個代碼的外觀。
這里有些暗處,因為我的C有點生銹,但是C允許您將函數體放在標頭中嗎? 我不記得是這樣。 嘗試將Testing()和print()的定義移動到.c文件中? 您也可以嘗試使用C ++進行編譯,以查看是否可以解決該問題,如果不需要/不需要C。
您將test.h
包含在main.c
,而根據您的編寫,您的聲明位於test1.h
。 注意名稱中的1
。
除此之外,您還要編譯test.c
並鏈接test.o
,而實際上,文件名是test1.c
。 同樣,請注意名稱中的1
。
編輯:現在,您已編輯main.c
包含的文件的名稱。 編輯之后,可以斷言您描述的大多數症狀不是文件的當前版本所可能的。 重新驗證您在做什么,發布更新的診斷信息和/或發布真實代碼。
盡管如此,您的編譯器和鏈接器行仍引用舊文件名。
我不知道是什么原因引起的,但是我現在有這個問題。 嘗試刪除.h文件,並將函數的聲明放在.c文件本身的頂部。
在這種情況下,刪除test1.h並將test1.c函數的聲明放入test1.c中。 並在test.c中包含test1.c,您將不再收到該警告消息,也不會出現以下鏈接錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.