[英]Error when compiling with GCC
每次編譯時,我都會收到以下錯誤消息:
Undefined reference to ( function name )
假設我有三個文件: Main.c
, printhello.h
, printhello.c
。 Main.c
調用 function print_hello()
,返回“Hello World”。 function 在printhello.c
中定義。
現在,這是 printhello.h 的以下代碼:
#ifndef PRINTHELLO_H
#define PRINTHELLO_H
void print_hello();
#endif
我確信這段代碼很好。 不過,我仍然不知道為什么它會給我這個錯誤。 你能幫助我嗎?
未定義的引用是 linker 錯誤。 您是否正在編譯和鏈接所有源文件? 由於 main.c 調用print_hello()
, linker 應該看到它的定義。
gcc Main.c printhello.c -o a.out
我認為該錯誤是 linker 錯誤而不是編譯器錯誤; 它試圖告訴您,您還沒有提供制作完整程序所需的所有功能。
您需要像這樣編譯程序:
gcc -o printhello Main.c printhello.c
這假設您的文件Main.c
類似於:
#include "printhello.h"
int main(void)
{
print_hello();
return 0;
}
並且您的文件printhello.c
類似於:
#include "printhello.h"
#include <stdio.h>
void print_hello(void)
{
puts("Hello World");
}
您在printhello.h
中的聲明應該是:
void print_hello(void);
這明確表示 function 不帶任何參數。 帶有空括號的聲明意味着“有一個 function print_hello()
它不返回任何值並采用不確定的(但不是可變的)參數列表”,這是完全不同的。 特別是,您可以使用任意數量的 arguments 調用print_hello()
,並且編譯器無法拒絕該程序。
請注意,C++ 將空參數列表視為與void print_hello(void);
相同。 (因此它將確保對print_hello()
的調用不包含任何參數),但 C++ 與 C 不同。
另一種方法是為 printhello 顯式構建 object 文件:
gcc -c printhello.c -o printhello.o
gcc -o Main main.c printhello.o
這具有允許其他程序使用 print_hello 方法的額外好處
似乎錯誤來自 linker 而不是編譯器。 您需要編譯並鏈接兩個源文件。 我認為您所做的只是在Main.c
中包含 header 文件,而您沒有編譯printhello.c
你需要:
gcc Main.c printhello.c -o myprog
或者
首先構建 object 文件
gcc -c printhello.c
gcc -c Main.c
然后鏈接它們
gcc Main.o printhello.o
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.