簡體   English   中英

如何在沒有 main 函數的情況下編譯 C 源代碼?

[英]How to compile C source code without a main function?

如何編譯我的 C 源文件而不需要在其中放置main函數?

對於沒有 main 函數並且不想添加 main 函數只是為了編譯的.c文件,我收到一個錯誤。

在 GCC 上, -c開關就是你想要的。

-c意思是“編譯,不鏈接”,你會得到一個name.o輸出文件。

假設你有 hello.c:

#include<stdio.h>
#include<stdlib.h>
_start()
{
   exit(my_main());
}
int my_main()
{
   printf("Hello");
   return 0;
}

編譯為:

gcc  -nostartfiles  hello.c 

你可以從中得到一個可執行文件。

使用編譯器的-c選項(適用於 GCC,其他 c 編譯器的選項可能相同)。

從 GCC 的手冊頁:

當您調用 GCC 時,它通常會進行預處理、編譯、匯編和鏈接。 “整體選項”允許您在中間階段停止此過程。 例如,-c 選項表示不運行鏈接器。 然后輸出由匯編器輸出的目標文件組成。

鏈接階段是尋找main()並在找不到時抱怨的步驟。

您可以在沒有main情況下編譯單個文件,但不能鏈接它們,當然也不能運行它們,因為它們不是完整的程序。 請注意,valgrind 不是靜態分析工具而是運行時工具,因此它對未鏈接到可運行程序的單個翻譯單元無用。

如果要測試單個文件,通常的做法是在每個文件中包含如下內容:

#ifdef UNIT_TEST
int main(int argc, char **argv)
{
    /* unit test code goes here */
}
#endif

並使用-DUNIT_TEST編譯文件。

如果你想在不鏈接的情況下編譯,上面的答案是正確的,使用-c開關。 如果您想要一個“獨立的”可執行文件,請使用-entry:function開關。 默認或“托管環境”可執行文件的入口點為-entry:mainCRTStartup ,它調用main 請注意,如果您正在制作freestanding可執行文件,則不能使用freestanding庫之外的標准庫<float.h><iso646.h><limits.h><stdalign.h><stdarg.h><stdbool.h><stddef.h><stdint.h><stdnoreturn.h>

什么時候編寫freestanding可執行文件? KernelsDrivers 如果您對os-dev ,那么您需要編寫它們。 如果您為硬件制造商(例如顯卡制造商)工作,則需要為他們編寫驅動程序。

一些使用嵌入式單元測試,而另一些使用條件編譯將它們編寫為單獨的文件。 請記住,# #definemakefile命令有一定程度的重疊。

要在 gcc 中不使用 main() 進行鏈接,請為“條目”選擇一個函數來代替 main()。 鏈接時,添加此選項:

-e 條目

--entry=入口

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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