[英]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
可執行文件? Kernels
和Drivers
。 如果您對os-dev
,那么您需要編寫它們。 如果您為硬件制造商(例如顯卡制造商)工作,則需要為他們編寫驅動程序。
一些使用嵌入式單元測試,而另一些使用條件編譯將它們編寫為單獨的文件。 請記住,# #define
和makefile
命令有一定程度的重疊。
要在 gcc 中不使用 main() 進行鏈接,請為“條目”選擇一個函數來代替 main()。 鏈接時,添加此選項:
-e 條目
--entry=入口
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.