當前位置:首頁 » 編程軟體 » objc源碼編譯調試

objc源碼編譯調試

發布時間: 2023-05-21 09:11:55

❶ 新人求助用Devc++為什麼不能編譯,出現了cannot find -lobjc [Error] ld returned 1 exit status 的錯誤

應該是你上一次調試運行的程序沒被自動關掉,好像是devc++的一個bug。你打開任務管理器把對應名稱的exe強制停止之後再編譯就好了,至少我遇到這種錯誤時都是這樣的

❷ Objective-C命令行下編譯:

編譯命令的問題,沒有鏈接Foundation庫
一定要用命令編譯嗎?
加上這個參數試試,有點麻煩就是了

-framework Foundation

❸ 怎麼在ubuntu上的gcc 來編譯object-C

安裝完畢後,便可以透過make來編譯
###############################################################################
如果出現下面錯誤,則表示找不到NextSetup的相關liberary,必須要修正script shell為下
gcc `gnustep-config --objc-flags` -lgnustep-base hello.m -o hello
或是使用Automake的話,必須要再Makefile.am修改為

Java代碼
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=demo0
demo0_SOURCES= hello.m

INCLUDES= -I/usr/local/include/GNUstep \
-I/usr/include/GNUstep
demo0_LDADD = -lgnustep-base -lpthread -lobjc -lm

error: cannot find interface declaration for 『NXConstantString』

###############################################################################
如果出現以下錯誤,表示你的gcc尚不支援cc1obj,必須要安裝gobjc
gcc: error trying to exec 'cc1obj': execvp: No such file or directory

>>sudo apt-get install gobjc

❹ C語言中編譯 生成 調試 測試 運行各是什麼意思有什麼區別

C語言中編譯 生成 調試 測試 運行的區別如下:

區別一:

從編譯方面來看:

編譯依賴於編譯器,英文是compile, vc中這一過程是將源代碼轉換成目標文件,如:obj文件,rc文件等。

區別二:

從生成方面來看:

生成指的是連接的過程,英文是build,依賴於鏈接器。vc中在這一階段將所有的目標文件和所有需要用到的組件組合成一個整體,例如需要生成的是windows系統下的PE可執行文件,鏈接器會依照特定格式將目標文件組合,最後生成PE格式的,exe或dll文件。

區別三:

從調試方面來看:

調試是所有或部分代碼編寫完成後,讓程序在調試器中運行,用這種手段對程序進行分析,找出並修正潛在問題。

區別四:

從運行方面來看:

運行就是讓程序在系統中運行。

(4)objc源碼編譯調試擴展閱讀:

C語言的介紹:

C語言是目前流行的通用程序設計語言,是計算機專業人員和計算機愛好者開發軟體的首選開發工具。C語言源程序必須經過某種編譯工具翻譯成為目標機器語言程序才能夠在計算機上執行。

然而隨著程序編寫規模的擴大,順利編寫出正確的程序絕非一件容易的事情,早期的許多編譯工具僅僅提供翻譯功能,已滿足不了應用的要求,編程人員需要-種功能全面並高度集成的編譯環境。

程序是一段具有一定功能的代碼,編寫程序的目的是解決問題。當程序人員寫完程序後,其實並不起作用,只有當編寫的程序經過一系列的處理後,能夠解決問題時。

序才成為真正的程序,這一系列的處理過程,-般就是編輯、編譯、連接、調試與運行等。目前最成熟的C語言集成環境主要有Turbo C2.0和Turbo C 3.0( 簡稱TC30)或Borland C++3.1( 簡稱BC31)以及Visual C++ 6.0。

❺ xcode 如何編譯

Xcode 常用編譯選項設置
在xcconfig文件中指定即可。
用標准庫連接
LINK_WITH_STANDARD_LIBRARIES = YES如果激活此設置,那麼編譯器在鏈接過程中會自動使用通過標准庫的鏈接器。
Info.plist 輸出編碼
INFOPLIST_OUTPUT_FORMAT = binary指定Info.plist文件的輸出編碼(默認情況下,輸出與輸入的編碼保持不變),這個輸出編碼能指定「binary」或者「XML」。
生 成調試符號GCC_GENERATE_DEBUGGING_SYMBOLS = NO當啟用的時候,詳情等級能夠通過build的』Level of Debug Symbols』設置去控制。 隱藏內聯方法GCC_INLINES_ARE_PRIVATE_EXTERN = YES Objective-C GCGCC_ENABLE_OBJC_GC = Unsupported 優化級別GCC_OPTIMIZATION_LEVEL = Fastest, Smallest [-OS]
None: 不做優化使用這個設置,編譯器的目標是減少編譯成本,使調試產生預期的結果。
Fast:優化編譯將為大函數佔用更多的時間和內存使用這個設置,編譯器將嘗試減少代碼的大小和執行時間,不進行任何優化,需要大量編譯時間。
Faster:編譯器執行幾乎所有支持的優化,它不考慮空間和速度之間的平衡與「Fast」設置相比,該設置會增加編譯時間和生成代碼的性能。編譯器不進行循環展開、內聯函數和寄存器變數的重命名。
Fastest:開啟「Faster」支持的所有的優化,同時也開啟內聯函數和寄存器變數的重命名選項
Fastest,smallest:優化代碼大小這個設置啟用「Faster」所有的優化,一般不增加代碼大小,它還執行旨在減小代碼大小的進一步優化。
C 語言方言GCC_C_LANGUAGE_STANDARD = C89 警告 檢查Switch語句GCC_WARN_CHECK_SWITCH_STATEMENTS = YES 隱藏局部變數GCC_WARN_SHADOW = YES 隱式轉換成32位的類型GCC_WARN_64_TO_32_BIT_CONVERSION = YES 未完成的Objective-C協議GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES 抑制所有的警告GCC_WARN_INHIBIT_ALL_WARNINGS = NO 初始化時沒有完整的括弧GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES例子(a沒有完全的括弧,b有):
int a[ 2 ][ 2 ] = { 0, 1, 2, 3 };
int b[ 2 ][ 2 ] = { { 0, 1 }, { 2, 3 } };
不匹配的返回類型
GCC_WARN_ABOUT_RETURN_TYPE = YES 缺少括弧GCC_WARN_MISSING_PARENTHESES = YES例子:
{
if( a )
if( b )
foo();
else
bar();
}
{
if( a )
{
if( b )
foo();
else
bar();
}
}
在結構體初始化時缺少欄位
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES
缺 少函數原型GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES 在文件結尾缺少新行GCC_WARN_ABOUT_MISSING_NEWLINE = YES 選擇了多個定義的類型(@Selector)GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO 嚴格的Selector匹配GCC_WARN_STRICT_SELECTOR_MATCH = YES 把缺少函數原型當作錯誤GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES 把所有的警告當作錯誤GCC_TREAT_WARNINGS_AS_ERRORS = YES 未定義的SelectorGCC_WARN_UNDECLARED_SELECTOR = YES 未初始化的自動變數GCC_WARN_UNINITIALIZED_AUTOS = YES 未知的Pragma指令GCC_WARN_UNKNOWN_PRAGMAS = YES 未使用的函數GCC_WARN_UNUSED_FUNCTION = YES 未使用的標簽GCC_WARN_UNUSED_LABEL = YES 未使用的參數GCC_WARN_UNUSED_PARAMETER = YES 未使用的值GCC_WARN_UNUSED_VALUE = YES當一個語句計算的結果顯式的未使用的時候發出警告 未使用的變數GCC_WARN_UNUSED_VARIABLE = YES 警告-所有過時的函數GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES offsetof宏未定義使用的警告GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES
iphone 常用的<app>-info.plist設置
Application requires iPhone environment如 果應用程序不能在ipod touch上運行,設置此項為true;
Application uses Wi-Fi如果應用程序需要wi-fi才能工作,應該將此屬性設置為true。這么做會提示用戶,如果沒有打開wi-fi的話,打開wi-fi。為了節省 電力,iphone會在30分鍾後自動關閉應用程序中的任何wi-fi。設置這一個屬性可以防止這種情況的發生,並且保持連接處於活動狀態
Bundle display name這用於設置應用程序的名稱,它顯示在iphone屏幕的圖標下方。應用程序名稱限制在10-12個字元,如果超出,iphone將縮寫名 稱。
Bundle identifier這個為應用程序在iphone developer program portal web站點上設置的唯一標識符。(就是你安裝證書的時候,需要把這里對應修改)。
Bundle version這個會設置應用程序版本號,每次部署應用程序的一個新版本時,將會增加這個編號,在app store用的。
Icon already includes gloss and bevel effects默認情況下,應用程序被設置了玻璃效果,把這個設置為true可以阻止這么做。
Icon file(這個不用多說了)設置應用程序圖標的。
Main nib file base name應用程序首次啟動時載入的xib文件 這個基本用不到。
Initial interface orientation 確定了應用程序以風景模式還是任務模式啟動
Localizations多語言。應用程序本地化的一列表,期間用逗號隔開,例如 應用程序支持英語 日語,將會適用 English,Japanese. Status bar is initially hidden 設置是否隱藏狀態欄。你懂的。
Status bar style選擇三種不同格式種的一種。
URL types應用程序支持的url標識符的一個數組。
用URL Scheme進行程序跳轉
打開info.plist,添加一項URL types
展開URL types,再展開Item1,將Item1下的URL identifier修改為URL Scheme
展開URL Scheme,將Item1的內容修改為myapp
其他程序可通過myapp://訪問此自定義URL
參考:http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
IOS後台播放音樂
OS後台播放只是在IOS4.0以後的版本支持。
1,設置後台播放會話
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory: error:nil];
2,在info.plist裡面添加
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
靜態庫沒法包含category/分類?
如果你導入一個objc靜態庫,發現很多objc的category 不能調用,可以嘗試在主工程中加入linker選項:
-all_load 加入這個一般就夠了
-ObjC
讓程序最小化再開啟時,從頭開始:
按下 「Home」 鍵以後程序可能並沒有退出而是轉入了後台運行。如果您想讓應用直接退出,最簡單的方法是:在 info-plist 裡面找到 Application does not run in background 一項,勾選即可。
程序退出後任務欄還是有圖標,但是程序原來的所有運行狀態全部丟失,點擊任務欄圖標也不過相當於再次啟動程序;如果允許後台運行,點擊任務欄圖標後會恢復程序中斷時的界面。
本地化字元串:
在infoPlist.strings裡面寫
「string1″=」水果」
代碼裡面寫 myLabel.text = NSLocalizedString(@」string1″, nil);
本地化的Bundle display name:
1)創建一個空文件,取名為InfoPlist.strings
2)對InfoPlist.strings進行本地化(Get Info -> Make Localization),然後設置需要的語言(如中文zh)
3)編輯不同的InfoPlist.strings文件,設置顯示名字
CFBundleDisplayName = 「名字」;
4)(這步不做貌似也可以)編輯Info.plist,添加一個新的屬性Application has localized display name, 設置其類型為boolean,並將其value設置為選中狀態
default圖片的銜接問題:
程序開始後,手動載入default圖片,然後進行過渡效果即可。
遍歷目錄:
NSString *appDocDir = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] relativePath];NSArray *contentOfFolder = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:appDocDir error:NULL];for (NSString *aPath in contentOfFolder) { NSLog(@"apath: %@", aPath); NSString * fullPath = [appDocDir :aPath]; BOOL isDir; if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDir] && !isDir) { [fileList addObject:aPath]; }}
IB:
不論寫不寫property的retain,由IBOutlet都會為對象加一個retainCount,所以只要連接了,就需要在viewDidUnload與dealloc中release並適當置為nil。
預先在IB裡面載入好的文件(比如圖片),即使釋放了Controller,IB中的文件也不會被釋放,直至內存警告,解決辦法是較大的資源用代碼載入。
UIWebView:
用代碼載入UIWebView的內容,navigationType是UIWebViewNavigationTypeOther
CAAnimation:
一定要記得[self.view.layer removeAllAnimations];因為CAAnimation會retain它的delegate
設備型號識別,可通過審核:
+ (NSString*)getDeviceVersion{ size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = (char*)malloc(size); sysctlbyname("hw.machine", machine, &size, NULL, 0); NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding]; free(machine); return platform;}
輸出:
//@」iPad1,1″
//@」iPad2,1″
//@」i386″
逗號後面數字解釋:(i386是指模擬器)
1-WiFi版
2-GSM/WCDMA 3G版
3-CDMA版
AppleTV(2G) (AppleTV2,1)
iPad (iPad1,1)
iPad2,1 (iPad2,1)Wifi版
iPad2,2 (iPad2,2)GSM3G版
iPad2,3 (iPad2,3)CDMA3G版
iPhone (iPhone1,1)
iPhone3G (iPhone1,2)
iPhone3GS (iPhone2,1)
iPhone4 (iPhone3,1)
iPhone4(vz) (iPhone3,3)iPhone4 CDMA版
iPhone4S (iPhone4,1)
iPodTouch(1G) (iPod1,1)
iPodTouch(2G) (iPod2,1)
iPodTouch(3G) (iPod3,1)
iPodTouch(4G) (iPod4,1)
判斷ipad/iphone
12UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPadUI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
或者
1[[[UIDevice currentDevice] model] isEqualToString:@"iPad"];
判斷設備是否有攝像頭
1[UIImagePickerController isSourceTypeAvailable:];

❻ 第五篇:IOS類探究(成員變數值放在哪裡,成員變數信息放在哪裡)

我們簡單寫個demo,在我們定義的類HPWPerson里放了name,age屬性,還有_hobby成員變數

首先我們考慮兩個問題,類方法是放在哪裡?成員變數是放在哪裡?帶著這兩個問題我們進行深入的探究下。

我們通過上篇結尾的分析其實知道,實例方法,成員屬性,協議等都是存放在class_rw_t這個結構體里,如下面源碼所示,

我們繼續在class_rw_t結構體源碼里找下,發現有class_ro_t這個結構體,這個結構體是干什麼的呢?

我們通過列印得到如下:

@property (nonatomic ,) NSString *name;這個會生成下劃線的成員變數_name,
@property (nonatomic ,assign) int age;這個會生成下劃線的成員變數_age,
發現我們再列印class_ro_t里發現有上圖所示的成員變數,所以其中「_hobby」,「_age」,"_name"這些是存在class_ro_t這個結構里的。

通過上面我們發現,成員變數的值是放在對象里,成名變數名字以及一些大小信息放在類裡面,這個是為什麼呢?其實類裡面的結構體它就好比山坦一個模板,通過這個模板就可以生成各個成員變數信息,但是成員變數的值是不同的所以成員變數的值要存放在實例對象里,成員變數名及大小信息放在類裡面就可以。

接著我們再繼續探究下,在class_rw_t這個結構體里有class_ro_t這個結構體,那這兩個結構體有什麼關系呢?

1.class_ro_t是在編譯的時候生成的(只讀),是一個純凈的空間,不能被修改的

我們知道蘋果的runtime可以動態的修改屬性和方法,但是ro里又不支持修改的,那它是如何實現的呢?
我們先看下WWDC里的一個視頻講解:
WWDC講解ro,rw鏈接

通過上面的視頻我罩唯舉們知道,ro在編譯的時候生成,在內存不夠的時候就會進行移除,當要使用的時候就會重新從磁碟里去載入。在objc源碼里我們發現有個叫class_rw_ext_t的結構體,簡稱為rwe。class_rw_ext_t這個也不是每個類里都生成的,因為生成class_rw_ext_t是有條件的:或者有分類,或者runtime API修改的時候會生成這個rwe結構體。runtime是無法修改成員變數的,rwe在對ro里進行拷貝出的也是其中一部分,一般ro里也就10%的內容需要修改。接著我們看rwe源碼如下,也驗證了我們這點:如果有rwe就直接返回裡面的methods,沒有就返回ro里的baseMethods。

屬性存放在rw里源碼:如果有rwe就直接返回裡面的properties,沒有就返回ro里的baseProperties。

協議存放在rw里源碼:如果有rwe就直接返回裡面的protocols,沒有就返回ro里的baseProtocols。

設計元類只是單獨為了存放我們的類方法嗎?

其實其目的是為了復用消息機制。在OC中調⽤⽅法,其實是在給某個對象發送某條消息。
消息的發送在編譯的時候編譯器就會把⽅法轉換為objc_msgSend這個函數。
id objc_msgSend(id self, SEL op, ...) 這個函數有倆個隱式的參數:消息的接收者,消息的⽅法
名。通過這倆個參數就能去找到對應⽅法的實現。
objc_msgSend函數就會通過第⼀個參數消息的接收者的isa指針,找到對應的類,如果我們是通過
實例對象調⽤⽅法,那麼這個isa指針就會找到實例對象的類對象,如果是類對象,就會找到類對
象的元類對象,然後再通過SEL⽅法名找到對應的imp,然後就能找到⽅法對應的實現。
那如果沒有元類的話,那這個objc_msgSend⽅法還得多加倆個參數,⼀個參數⽤來判斷這個⽅法
到底是類⽅法還是實例⽅法。⼀個參數⽤來判斷消息的接受者到底是類對象還是實例對象。
消息的發送,越快越好。那如果沒物碧有元類,在objc_msgSend內部就會有有很多的判斷,就會影響
消息的發送效率。
所以元類的出現就解決了這個問題,讓各類各司其職,實例對象就⼲存儲屬性值的事,類對象存儲
實例⽅法列表,元類對象存儲類⽅法列表,符合設計原則中的單⼀職責,⽽且忽略了對對象類型的
判斷和⽅法類型的判斷可以⼤⼤的提升消息發送的效率,並且在不同種類的⽅法⾛的都是同⼀套流
程,在之後的維護上也⼤⼤節約了成本。
所以這個元類的出現,最⼤的好處就是能夠復⽤消息傳遞這套機制。不管你是什麼類型的⽅法,都
是同⼀套流程。

接著我們如何證明我們上面所說的呢?下面我們來看下在源碼里設置斷點調試:

首先我們打開objc的源碼,

我們一直按上面去列印,最後會列印一個classMethod這個類方法,在我們設置HPWPerson這個類里也有這個方法,如下,所以證明了類方法是存放在元類裡面的。

接著我們看些runtime的api方法的實現:

上面這些我們是用runtime的api把成員變數,實例方法,類方法等列印出來。
通過上面總結:
1)ro里存放成員變數,實例方法,屬性,協議,類對象
2)類方法存放在元類裡面

❼ 在VS2010的VC++中如何編譯、鏈接、運行、調試程序

看圖說話!

❽ 如何在Windows上編譯Objective-C

1、安裝GNUstep
GNUstep Windows Installer提供了Windows平台下的Object-C的模擬開發環境,一共有四個軟體包,其中GNUstep System和GNUstep Core是必裝的,GNUstep Devel和Cairo Backend是選裝的。只安裝前兩個就夠了。

2、編寫Objective-C代碼
安裝完成後,在開始菜單里的GNUstep選項里執行shell,就能打開命令行。直接在Windows里進入C:/GNUstep/home/Administrator(我的是Administrator,可能有的不一樣)目錄,在這里用你喜歡的工具(現在UltraEdit和Notepad++編輯器好像可以代碼高亮)編寫Object-C程序。
如:HelloWorld.m

#import <Foundation/Foundation.h>

int main (int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Hello World!");
[pool drain];

return 0;
}

3、配置環境變數
這一步很重要。GNUstep.sh是用來設置GNUstep開發環境變數的,如果沒有執行,就會有很多頭文件,庫文件,命令找不到

在一個目錄里寫好了源代碼以後,編寫一個make配置文件,名字必須叫GNUmakefile,內容是

include $(GNUSTEP_MAKEFILES)/common.make

TOOL_NAME=Test
Test_OBJC_FILES=HelloWorld.m

include $(GNUSTEP_MAKEFILES)/tool.make

可以修改上面的黑體部分

然後就是
make

命令運行成功就可以看到新增了一個obj目錄,裡面就有你要的可執行文件和.o文件。

OK 搞定了。

❾ C語言程序操作是先調試還是編譯

首先得編譯通過,你才能調試啊,編譯正確後,會生成exe文件,IDE中啟動程序,可以進行調試。

編譯是把源代碼變成二進制obj的過程(鏈接後成為可執行文件),當然會先幫你檢查有無簡單的語法問題,要不編譯器人家不認識,你自己說的有無邏輯就和編譯器無關了。
調試首先需要生成二進制代碼,所以需要首先進行編譯和鏈接,然後到斷點後,調試器會幫你加int 3中斷,就停住了。

❿ 為什麼我用易語言靜態編譯出來的是是obj文件,然後該怎麼弄軟體才用能打開

OBJ是C源碼中的一種,出現你的這種情況,先確定易編譯是否被攔截,編譯連接器是否正常。

熱點內容
地址存儲器的容量 發布:2025-07-17 23:42:56 瀏覽:166
win7電腦用戶名和密碼在哪裡查詢 發布:2025-07-17 23:39:44 瀏覽:475
安卓手機顏色怎麼變色 發布:2025-07-17 23:26:43 瀏覽:374
java離線安裝 發布:2025-07-17 23:23:31 瀏覽:376
位置伺服器地址是什麼 發布:2025-07-17 23:18:00 瀏覽:840
phpif一行 發布:2025-07-17 23:12:27 瀏覽:729
安裝腳本精靈 發布:2025-07-17 23:11:35 瀏覽:126
我的世界基岩版中國玩家的生存伺服器 發布:2025-07-17 23:06:34 瀏覽:680
顯示linux隱藏文件 發布:2025-07-17 23:00:24 瀏覽:923
三地的演算法 發布:2025-07-17 22:56:09 瀏覽:354