簡體   English   中英

使用 GCC 編譯時出錯

[英]Error when compiling with GCC

每次編譯時,我都會收到以下錯誤消息:

Undefined reference to ( function name )

假設我有三個文件: Main.cprinthello.hprinthello.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM