當前位置:首頁 » 編程軟體 » 關於編譯器告警的說法正確的是

關於編譯器告警的說法正確的是

發布時間: 2023-06-07 02:50:33

『壹』 有以下代碼,關於代碼的編譯,正確的說法是( )

選A唄~

『貳』 錯誤 1 error C1853: 「Debug\test.c.pch」預編譯頭文件來自編譯器的早期版本,或者預編譯頭為 C++ 而在 C

告警信息里有說明,可能是你包含的頭文件是不當前所使用編譯器里的頭文件。
檢查一下頭文件是不是當前所使用的編譯器里的文件。

『叄』 AIX下xlc編譯C程序報警,Duplicate symbol,求助

plicate symbol是一種常見的鏈接錯誤,不像編譯錯誤那樣可以直接定位到問題的所在。但是經過一段時間的總結,發現這種錯誤總是有一些規律可以找的。
例如,我們有如下的最簡單的兩個類代碼:

// ClassA.h
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end

// ClassA.m
#import "ClassA.h"
@implementation ClassA
@end

// ClassB.h
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end

// ClassB.m
#import "ClassB.h」

@implementation ClassB
@end

編譯後出現的錯誤信息如下:

plicate symbol _OBJC_METACLASS_$_ClassA in:
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.o
plicate symbol _OBJC_CLASS_$_ClassA in: /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.old: 2
plicate symbols for architecture i386clang:
error: linker command failed with exit code 1 (use -v to see invocation)

從上面出現問題的地方,我們應該能推測出是ClassA這個類出了問題。如果這個類是我們自己寫的,就容易辦一些。
可以考慮以下原因:
1.引入頭文件時,由於疏忽,誤引入.m文件。這種一般仔細檢查一下出現問題的類的源文件就能發現。
例:ClassB.m 文件修改成下面這樣

#import "ClassB.h>"
#import "ClassA.m」 // 這句話有問題
@implementation ClassB
@end

2.同一個類,實現兩次,即有兩個@implementation 。這種一般會有一個警告,也比較容易發現。
例:ClassB.m文件修改成下面這樣:

// ClassB.m
#import "ClassB.h」
@implementation ClassB
@end
@implementation ClassA
@end

3.工程文件,同一個類文件被引入了兩次,引起這種錯誤的原因大概有兩種:一是多人協作開發時,導致project文件合並沖突;二是同名文件不在同一目錄下,添加到工程時造成重復添加。 這種一般在文件視圖,用名字過濾器檢查一下就發現了。
4. Targets的Build Phase設置項里,查看Complie Sources這一項,看看出現問題的類是不是有重復的,用文件名過濾也比較容易發現。這種問題一般也是多人協作開發時,project文件沖突導致的。發現這種問題,只要刪除就可以了。不過在我解決問題過程中,刪除其中一個文件時,重復文件會自動全部刪除,所以還需要單獨添加一下。
5.如果我們的工程中引用了第三方的庫,而恰好第三方的庫裡面有一個ClassA,也會出現這種問題。如果不能修改第三方的庫代碼,只能修改我信自己的代碼了。

『肆』 vs2019不小心把兩個程序弄了一個解決方案

想要解決可以根據
1.庫的分類

根據鏈接時期的不同,庫又有靜態庫和動態庫之分。

靜態庫是在鏈接階段被鏈接的(好像是廢話,但事實就是這樣),所以生成的可執行文件就不受庫的影響了,即使庫被刪除了,程序依然可以成功運行。

有別於靜態庫,動態庫的鏈接是在程序執行的時候被鏈接的。所以,即使程序編譯完,庫仍須保留在系統上,以供程序運行時調用。(TODO:鏈接動態庫時鏈接階段到底做了什麼)

2 靜態庫和動態庫的比較

鏈接靜態庫其實從某種意義上來說也是一種粘貼復制,只不過它操作的對象是目標代碼而不是源碼而已。因為靜態庫被鏈接後庫就直接嵌入可執行文件中了,這樣就帶來了兩個問題。

首先就是系統空間被浪費了。這是顯而易見的,想像一下,如果多個程序鏈接了同一個庫,則每一個生成的可執行文件就都會有一個庫的副本,必然會浪費系統空間。

再者,人非聖賢,即使是精心調試的庫,也難免會有錯。一旦發現了庫中有bug,挽救起來就比較麻煩了。必須一一把鏈接該庫的程序找出來,然後重新編譯。

而動態庫的出現正彌補了靜態庫的以上弊端。因為動態庫是在程序運行時被鏈接的,所以磁碟上只須保留一份副本,因此節約了磁碟空間。如果發現了bug或要升級也很簡單,只要用新的庫把原來的替換掉就行了。

那麼,是不是靜態庫就一無是處了呢?

答曰:非也非也。不是有句話么:存在即是合理。靜態庫既然沒有湮沒在滔滔的歷史長河中,就必然有它的用武之地。想像一下這樣的情況:如果你用libpcap庫編了一個程序,要給被人運行,而他的系統上沒有裝pcap庫,該怎麼解決呢?最簡單的辦法就是編譯該程序時把所有要鏈接的庫都鏈接它們的靜態庫,這樣,就可以在別人的系統上直接運行該程序了。

所謂有得必有失,正因為動態庫在程序運行時被鏈接,故程序的運行速度和鏈接靜態庫的版本相比必然會打折扣。然而瑕不掩瑜,動態庫的不足相對於它帶來的好處在現今硬體下簡直是微不足道的,所以鏈接程序在鏈接時一般是優先鏈接動態庫的,除非用-static參數指定鏈接靜態庫。

gcc作為編譯工具,用在Linux操作系統中,可以編譯C、C++、Object-C、JAVA等語言。編譯過程中可以帶編譯選項,選擇編譯過程。

一、GCC編譯流程

1)預處理 Pre-Processing

2)編譯 Compiling

3)匯編 Assembling

4)鏈接 Linking

二、GCC編譯選項

1、gcc總體選項列表

1) -c :指編譯,不鏈接,生成目標文件「.o」。

2) -S :只編譯,不匯編,生成匯編代碼「.S」。

3) -E :只進行預編譯/預處理,不做其他處理。

4) -o file:把輸出文件輸出到file里。

5) -g :在可執行程序中包含標准調試信息。

6) -v :列印出編譯器內部編譯各過程的命令行信息和編譯器的版本。

7) -I dir :在頭文件的搜索路徑列表中添加dir目錄

8) -L dir :在庫文件的搜索路徑列表中添加dir目錄

9) -static :連接靜態庫(靜態庫也可以用動態庫鏈接方式鏈接)

10) -llibrary :連接名為library的庫文件(顯示指定需要鏈接的動態庫文件)

2、gcc告警和出錯選項

1) -ansi :支持符合ANSI標準的C程序

2) -pedantic :允許發出ANSI C標准所列出的全部警告信息

3) -pedantic-error :允許發出ANSI C標准所列出的全部錯誤信息

4) -w :關閉所有警告

5) -Wall :允許發出gcc提供的所有有用的報警信息

6) -werror :把所有的告警信息轉化為錯誤信息,並在告警發生時終止編譯過程

3、gcc優化選項

gcc可以對代碼進行優化,它通過編譯選項「-On」來控制優化代碼的生成,其中n是一個代表優化級別的整數。對於不同版本的gcc,

n的取值范圍不一致,比較典型的范圍為0變化到2或者3。

雖然優化選項可以加速代碼的運行速度,但對於調試而言將是一個很大的挑戰。因為代碼在經過優化之後,原先在源程序中聲明和使用

的變數很可能不再使用,控制流也可能會突然跳轉到意外的地方,循環語句也可能因為循環展開而變得到處都有。

三、GCC生成動態庫和靜態庫

1)動態庫生成

1.單個源文件/目標直接生成動態庫

a. gcc -fPIC -shared xxx.c -o libxxx.sob.gcc -fPIC -shared xxx.o -o libxxx.so
2.多個源文件/目標生成動態庫

a.gcc -fPIC -shared xxx1.c xxx2.c xxx3.c -o libxxx.so b.gcc -fPIC -shared xxx1.o xxx2.o xxx3.o -o libxxx.so
2)靜態庫生成

1.單個源文件/目標直接生成靜態庫

a.ar -rc libxxx.a xxx.o(正確方法)b. ar -rc libxxx.a xxx.c (靜態庫可以生成;當運行連接了該靜態庫的可執行程序會報錯:could not read symbols:Archive has no index;run ranlib to add one)
2.多個源文件/目標生成靜態庫

a.ar -rc libxxx.a xxx1.o xxx2.o xxx3.o (正確方法)b.ar -rc libxxx.a xxx1.c xxx2.c xxx3.c (靜態庫可以生成;當運行連接了該靜態庫的可執行程序會報錯:could not read symbols:Archive has no index;run ranlib to add one)
四、多個源文件生成一個可執行文件

熱點內容
lol一區為什麼伺服器好卡 發布:2025-02-12 09:02:22 瀏覽:629
安卓運營商cm是哪個版本 發布:2025-02-12 09:00:00 瀏覽:515
pythonmd5校驗 發布:2025-02-12 08:51:00 瀏覽:470
編程題解析 發布:2025-02-12 08:40:30 瀏覽:454
bilibi手機緩存目錄在 發布:2025-02-12 08:33:11 瀏覽:458
聽ti密碼是多少 發布:2025-02-12 08:22:15 瀏覽:288
淘寶上傳視頻憑證 發布:2025-02-12 08:06:46 瀏覽:878
java畫 發布:2025-02-12 08:01:00 瀏覽:550
光遇安卓官服是在哪裡下載 發布:2025-02-12 07:47:47 瀏覽:648
安卓手機如何關閉程序打開廣告 發布:2025-02-12 07:31:06 瀏覽:469