[英]Questions about Compilation
我一直在想最好的方法來編譯> 1000行代碼的項目。 我只是有一些有關編譯項目的最佳方法的基本問題。 我正在使用GCC,如果有幫助的話。 我的問題是:
我的意思是,如果我有兩個這樣的文件:
源代碼
#include<stdio.h>
...
void static test_func( ){ printf( "Hey!" ); }
Source2.c
#include<stdio.h>
...
void static test_func( ){ printf( "Hey!" ); }
函數printf是否兩次復制到可執行文件中? 我想避免這種情況,因為很多時候我會擁有多個共享相同頭文件的源文件,並且我想知道這是否是一個不好的做法。
一次,我只是通過使用此文件包含了其他源文件:
源代碼
#include<stdio.h>
#include "source2.c"
但是我不確定這是否也是不好的做法。 這使我想到另一個問題:
注意:不好的做法是指是否違背常規或導致某種效率低下。
編輯:我剛剛讀過庫是文件之間共享。 我請客,這意味着我的第一個問題的答案是“否”。 但是,我很好奇,是否使用預處理器包含源文件是一種常見的做法。
靜態鏈接期間,庫函數僅包含一次。 如果該庫是動態的,則根本不添加任何副本,而僅添加動態鏈接信息。
除非您有特殊原因,否則包括.c
文件是很奇怪的。 一個這樣的原因是外部模塊測試程序,在那里你不希望main
模塊中的功能在所有,但在為了正確測試的同時, main
需要訪問所有文件的靜態數據,無法由其他文件訪問。
不跨文件多次包含庫將不會使它在最終可執行文件中多次包含
鏈接器負責解析功能,當發現它已經知道該功能並且已經包含了該鏈接器時,它將不會嘗試將其再次包含在靜態鏈接中。此外,鏈接器將確保它僅包含包含以下內容的必要文件:靜態鏈接中的特定定義。
在動態鏈接中,鏈接器會將應用程序在運行時所需的動態庫文件加載到內存中
請注意,像stdio.h
這樣的庫頭文件僅包含printf
類的printf
聲明 ; 它們不包含這些功能的實際代碼 。 當鏈接所有目標文件和相關庫以形成最終可執行文件時,會在鏈接時添加諸如printf
功能的實際代碼。
像您的示例中那樣包含源文件通常被認為是不好的做法,盡管可能會有特定的用例。 我只是想不到任何好的東西。 您冒着重復定義錯誤的更大風險,並且不必要地結束了代碼的重建。 編譯器可能一次坐下來可以消化多少代碼,這是有限制的。 包括包含源文件的源文件可能會導致構建時間過長甚至更糟。 已經有一段時間了,但是我已經看到編譯器在非常大的文件上阻塞,特別是在您要優化輸出的情況下。
將代碼拆分為多個源文件的好處在於,如果我只更改一個文件中的內容,(通常)我就不必重建整個項目(當然,這取決於更改的內容)。 我只需要重新編譯該文件並重新鏈接即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.