簡體   English   中英

有關編譯的問題

[英]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.

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