當前位置:首頁 » 編程軟體 » 編譯與位置無關

編譯與位置無關

發布時間: 2022-04-19 15:11:35

① 為什麼我的java程序在cmd下編譯通過了而在Eclipse下編譯不通過

為什麼eclipse創建項目不要用jre,需要用jdk

② 什麼是 CORBA 。

CORBA(Common Object Request Broker Architecture公共對象請求代理體系結構)是由OMG組織制訂的一種標準的面向對象應用程序體系規范。或者說 CORBA體系結構是對象管理組織(OMG)為解決分布式處理環境(DCE)中,硬體和軟體系統的互連而提出的一種解決方案;OMG組織是一個國際性的非盈利組織,其職責是為應用開發提供一個公共框架,制訂工業指南和對象管理規范,加快對象技術的發展。

OMG組織成立後不久就制訂了OMA(Object Management Architecture,對象管理體系結構)參考模型,該模型描述了OMG規范所遵循的概念化的基礎結構。OMA由對象請求代理ORB、對象服務、公共設施、域介面和應用介面這幾個部分組成,其核心部分是對象請求代理ORB(Object Request Broker)。對象服務是為使用和實現對象而提供的基本服務集合;公共設施是向終端用戶應用程序提供的一組共享服務介面;域介面是為應用領域服務而提供的介面;應用介面是由開發商提供的產品,用於它們的介面,不屬於OMG標準的內容。ORB提供了一種機制,通過這種機制,對象可以透明的發出請求和接收響應。分布的、可以互操作的對象可以利用ORB構造可以互操作的應用。

CORBA標准由對象管理組織(OMG)設立並進行控制,CORBA定議了一系列API,通信協議,和物件/服務信息模型用於使得異質應用程序能夠互相操作,這些應用程序用不同的程序語言編寫,運行在不同的平台上。CORBA因此為定義明確的物件提供了平台和位置的透明性,這些物件是分布式計算平台的基礎。

CORBA分布計算技術,是由絕大多數分布計算平台廠商所支持和遵循的系統規范技術,具有模型完整、先進,獨立於系統平台和開發語言,被支持程度廣泛的特點,已逐漸成為分布計算技術的標准。COBRA標准主要分為3個層次:對象請求代理、公共對象服務和公共設施。最底層是對象請求代理ORB,規定了分布對象的定義(介面)和語言映射,實現對象間的通訊和互操作,是分布對象系統中的"軟匯流排";在ORB之上定義了很多公共服務,可以提供諸如並發服務、名字服務、事務(交易)服務、安全服務等各種各樣的服務;最上層的公共設施則定義了組件框架,提供可直接為業務對象使用的服務,規定業務對象有效協作所需的協定規則。

CORBA(公共對象請求代理架構):這是個和微軟com,com+齊名的同類軟體技術規范,由OMT提出。
用於在不同進程(程序)之間,甚至是不同物理機器上的進程(程序)之間通訊。底層技術依靠RPC[遠程過程調用]實現。
面向對象的軟體,以數據為中心設計,對象類既具有模塊的封裝性和類屬等特性,還具有繼承特性
,極大地提高了類的可擴充性和可再用能力。對象類較之於傳統軟體的功能模塊而另具有的優點是:
(1)易於理解,具有完整的語義特徵;
(2)易於擴充和修改,具有較高的通用性和適應性;
(3)易於構造組裝,具有規范的外部介面。
開發應用組件必須遵循標准,以保證軟體組件的互操作性,只有遵循統一的標准,不同廠商的、不同時期的、不同程序設計風格的、不同編程語言的、不同操作系統的、不同平台上的軟體或軟體部件才能進行交流與合作。為此,OMG(ObjectManageGroup)提供了一個對象標准CORBA,它定義了一個網連對象的介面,使得對象可以同時工作。基於CORBA的對象請求代理ORB為客戶機/伺服器開發提供了中間件的新格式。
作為OMG成員的微軟公司撇開CORBA而另闢了COM(ComponetObjectModel),即組件對象模型,並把COM定位成基於對象的軟體開發模型,盡管COM被認為是微軟鼓噪出來的技術,但支持COM的開發工具卻不斷增多,其中大部分來自於微軟,包括VisualBasic和VisualC ++。
公共對象請求代理結構:CORBA標准
全球性網路使線上的所有設備和軟體成為全球共享的浩瀚的資源,計算機環境也從集中式發展到分布式環境,開放式系統的發展使用戶能夠透明地應用由不同廠商製造的不同機型不同平台所組成的異構型計算資源,因此,分布式處理和應用集成自然而然地成為人們的共同要求,那麼什麼是分布式處理和應用集成呢?它們的功能和關鍵技術是什麼呢?簡單地講,分布式處理和應用集成就是指在異構的、網路的、物理性能差別很大的、不同廠商的、不同語言的信息資源的基礎上構建信息共享的分布式系統,並且能夠有效地進行應用系統和分布式處理的集成。分布式處理的關鍵在於定義可管理的軟體構件,即面向對象技術中的「對象」。應用集成的關鍵在於為跨平台、跨機種、跨編程語言的產品提供統一的應用介面。OMG組織針對當今信息產業的要求,公布了CORBA標准,即公共對象請求代理體系結構(Common Object Request Broker Architecture),這是一個具有互操作性和可移植性的分布式面向對象的應用標准。
CORBA的核心是對象請求代理ORB,它提供對象定位、對象激活和對象通訊的透明機制。客戶發出要求服務的請求,而對象則提供服務,ORB把請求發送給對象、把輸出值返回給客戶。ORB的服務對客戶而言是透明的,客戶不知道對象駐留在網路中何處、對象是如何通訊、如何實現以及如何執行的,只要他持有對某對象的對象引用,就可以向該對象發出服務請求。
CORBA允許用戶以兩種不同的方式提出對象請求:
1)靜態調用:
通過給定介面的存根,在編譯了對象代碼後,進入客戶端的程序。因此,靜態調用必須在編譯時就知道對象及其類型。
2)動態調用:
通過ORB的動態調用介面DII,在運行時生成訪問對象的代碼。
不管客戶以哪一種形式提出請求,ORB的任務是:找出所要對象的位置,激活該對象,向對象傳遞此請求。對象執行所請求的服務後,把輸出值返回給ORB,然後再由ORB返回給客戶。
CORBA的重要概念是:
1.對象連接
CORBA廣泛地支持對象的實現,在單伺服器系統中也可以實現由介面定義語言定義的介面。ORB的靈活性既可以直接集成已有的應用,又不會使新對象受某些原則的制約。
對象連接提供了有不同類型對象實現時,使用ORB服務的方法,服務包括:對象引用、方法調用、安全控制、對象實現的激活與靜候等。
2.介面定義語言(IDL)
CORBA用IDL來描述對象介面,IDL是一種說明性語言,它的語法類似於C++。
IDL提供的數據類型有:基本數據類型、構造類型、模板類型、和復合類型、操作說明。這些類型可以用來定義變元的類型和返回類型,操作說明則可以用來定義對象提供的服務。
IDL還提供模塊構造,其中可以包含介面,而介面是IDL各類型中最重要的,它除了描述CORBA對象以外,還可以用作對象引用類型。
IDL提供了介面繼承性,派生介面可以繼承其基類介面所定義的操作與類型。IDL的介面繼承性有其特殊性,此處不贅述。
總之,CORBA的IDL是一種說明性語言,描述面向對象系統開發所遵循的介面與實現相分離的基本原則。
3.動態調用介面
把IDL說明編譯成面向對象程序設計語言的實代碼後,客戶可以調用已知對象的操作。在某些應用中,用戶並不了解應用介面編譯信息,但也要求調用對象的操作,這時就要動態調用介面來調用用戶的操作了。例如,圖形用戶介面應支持用戶瀏覽介面公共庫,以獲得每個對象所支持的操作信息,用戶可根據自己的需求從瀏覽對象中挑選出所需的對象操作,具體的對象操作的調用實際上是用動態調用介面來完成的。
4.介面公用庫
介面公用庫持久地存儲IDL的介面說明,藉助於介面公用庫,可以實現對象繼承性層次結構的導航,並且提供了有關對象支持的所有操作的描述。介面公用庫最常見的功能是為介面瀏覽器提供信息,幫助應用開發者找出潛在的可重用的軟體部件。ORB可以利用介面公用庫檢查運行時的操作參數類型,但介面公用庫的基本功能是提供類型信息,為動態調用介面發送請求提供信息支持。

java 2是sun公司提供的現在更明為java EE 企業級的應用開發,是一種跨平台的語言,
.NET平台是微軟體提代的一種跨語言的的編程語言.

③ 如何設置NDK的編譯選項

1. 概述

首先回顧一下 Android NDK 開發中,Android.mk 和Application.mk 各自的職責。

Android.mk,負責配置如下內容:

(1) 模塊名(LOCAL_MODULE)

(2) 需要編譯的源文件(LOCAL_SRC_FILES)

(3) 依賴的第三方庫(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES)

(4) 編譯/鏈接選項(LOCAL_LDLIBS、LOCAL_CFLAGS)

Application.mk,負責配置如下內容:

(1) 目標平台的ABI類型(默認值:armeabi)(APP_ABI)

(2) Toolchains(默認值:GCC 4.8)

(3) C++標准庫類型(默認值:system)(APP_STL)

(4) release/debug模式(默認值:release)

由此我們可以看到,本文所涉及的編譯選項在Android.mk和Application.mk中均有出現,下面我們將一個個詳細介紹。

2. APP_ABI

ABI全稱是:Application binary interface,即:應用程序二進制介面,它定義了一套規則,允許編譯好的二進制目標代碼在所有兼容該ABI的操作系統和硬體平台中無需改動就能運行。(具體的定義請參考網路或者維基網路)

由上述定義可以判斷,ABI定義了規則,而具體的實現則是由編譯器、CPU、操作系統共同來完成的。不同的CPU晶元(如:ARM、Intel x86、MIPS)支持不同的ABI架構,常見的ABI類型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。

這就是為什麼我們編譯出來的可以運行於Windows的二進製程序不能運行於Mac OS/linux/Android平台了,因為CPU晶元和操作系統均不相同,支持的ABI類型也不一樣,因此無法識別對方的二進製程序。

而我們所說的「交叉編譯」的核心原理也跟這些密切相關,交叉編譯,就是使用交叉編譯工具,在一個平台上編譯生成另一個平台上的二進制可執行程序,為什麼可以做到?因為交叉編譯工具實現了另一個平台所定義的ABI規則。我們在Windows/Linux平台使用Android NDK交叉編譯工具來編譯出Android平台的庫也是這個道理。

這里給出最新 Android NDK 所支持的ABI類型及區別:

下面是我總結的一些常用的CFLAGS編譯選項:

(1)通用的編譯選項

-O2 編譯優化選項,一般選擇O2,兼顧了優化程度與目標大小

-Wall 打開所有編譯過程中的Warning

-fPIC 編譯位置無關的代碼,一般用於編譯動態庫

-shared 編譯動態庫

-fopenmp 打開多核並行計算,

-Idir 配置頭文件搜索路徑,如果有多個-I選項,則路徑的搜索先後順序是從左到右的,即在前面的路徑會被選搜索

-nostdinc 該選項指示不要標准路徑下的搜索頭文件,而只搜索-I選項指定的路徑和當前路徑。

--sysroot=dir 用dir作為頭文件和庫文件的邏輯根目錄,例如,正常情況下,如果編譯器在/usr/include搜索頭文件,在/usr/lib下搜索庫文件,它將用dir/usr/include和dir/usr/lib替代原來的相應路徑。

-llibrary 查找名為library的庫進行鏈接

-Ldir 增加-l選項指定的庫文件的搜索路徑,即編譯器會到dir路徑下搜索-l指定的庫文件。

-nostdlib 該選項指示鏈接的時候不要使用標准路徑下的庫文件

(2) ARM平台相關的編譯選項

-marm -mthumb 二選一,指定編譯thumb指令集還是arm指令集

-march=name 指定特定的ARM架構,常用的包括:-march=armv6, -march=armv7-a

-mfpu=name 給出目標平台的浮點運算處理器類型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16

-mfloat-abi=name 給出目標平台的浮點預算ABI,支持的參數包括:「soft」, 「softfp」 and 「hard」

④ 新手求解釋「C語言中程序中所有函數之間都可以相互調用,與函數所在位置無關」錯在哪裡難道說是main函

一個是任何其他函數無法調用main函數,因為main是程序入口,它是唯一的,不可能在裡面了再鑽入入口
另外,a函數調用b函數,b必須在a前面,或者b的類型(名稱和參數、返回值類型)在a之前申明過,不然編譯器在掃描a的時候不知道如何處理b

⑤ gcc編譯錯誤!

提示說需要-fPIC編譯,然後在鏈接動態庫的地方加上-fPIC的參數編譯結果還是報錯,需要把共享庫所用到的所有靜態庫都採用-fPIC編譯一邊才可以成功的在64位環境下編譯出動態庫。
這里的-fPIC指的是地址無關代碼

你看看這里的這篇文章吧:http://www.cnblogs.com/lightsalt/archive/2011/10/19/2217628.html

⑥ 在ARM嵌入式中,什麼是與位置相關的代碼,什麼是與位置無關的代碼

位置無關碼:CPU取指時,總是相對於本條執行指令的相對地址去取指。比如指行一個ADD指令時,PC要取下一指令的地址,就在原來的基礎上+4。這就不管你代碼放在存儲器的任何位置,只要他們的相對地址沒有改變,就能正常執行程序。一般上電復位那幾條語句就必須是位置無關碼指令。

位置相關碼:可以這樣來說,就是CPU每次取指都從絕對位置去取,而不是上面的相對位置。這個絕對地址就是相對起始地址0來說的。這樣,就要求你在存放程序時,必須給連接腳本所規定的一樣,把代碼放到指定位置。

⑦ 在Linux內核編譯的時候,一定要在/usr/src/kernel下才行嗎我怎麼在自己建立的文件夾下編譯總是報錯呢

Linux基礎知識:內核編譯-2.4至2.6
前言
linux-2.6.x內核發布後, 壇子里的兄弟們肯定都迫不及待地要升級原有的2.4.x內核. 但是由於與2.6.x內核配套的系統程序並沒有相應的來得及更新, 升級過程會碰到很多問題, 因此覺得有必要把我的經驗與大家share一下:-) XD們以後碰到類似問題時, 請先閱讀本文, 而不要一上來就盲目發帖.
1. 備份重要的數據
這是個好習慣,就不用多說了:-)
2. 下載最新的2.6.x內核源碼
這個當然要到官方網站或者它的mir...?去下載了, 最好別到那些unknown的網站去下, 因為那些源碼包有可能被惡意做了手腳. 最新的linux-2.6.4.tar.bz2源碼包大概有33M左右. 下載的時候可以泡杯coffee, 然後點根煙......
在/usr/src/目錄下解開源碼包, 得到源代碼目錄/usr/src/linux-2.6.4/. 在對kernel做任何事情之前, 建議你先看一下它的README文件和Documentation/Changes文件, 從中你會得到不少有用的信息. 這些信息會讓你在隨後的升級過程避免很多不必要的麻煩.
在文檔Documentation/Changes中給出了欲成功地升級到kernel-2.6.x所需的最小系統軟體要求, 比如對於kernel-2.6.4是這樣的:
復制內容到剪貼板代碼:
Gnu make 3.79.1 # make --version
binutils 2.12 # ld -v
util-linux 2.10 # fdformat --version
mole-init-tools 0.9.10 # depmod -V
e2fsprogs 1.29 # tune2fs
jfsutils 1.1.3 # fsck.jfs -V
reiserfsprogs 3.6.3 # reiserfsck -V 21|grep reiserfsprogs
xfsprogs 2.6.0 # xfs_db -V
pcmcia-cs 3.1.21 # cardmgr -V
quota-tools 3.09 # quota -V
PPP 2.4.0 # pppd --version
isdn4k-utils 3.1pre1 # isdnctrl 21|grep version
nfs-utils 1.0.5 # showmount --version
procps 3.2.0 # ps --version
oprofile 0.5.3 # oprofiled --version
對於RH8/9的用戶而言, 上述要求基本上都能滿足. 大概只有兩個程序需要更新: motils工具包和mkinitrd程序.
3. 安裝mole-init-tools-3.0.tar.gz工具包
linux-2.6.x內核的mole處理過程有所改變(很多原先在用戶態下由motils處理的工作都放到內核里去完成了), 因此2.4.x下的motils工具包已經不在適合新的2.6.x內核, 必需將其升級到mole-init-tools工具包. 該工具包的最新版本是3.0(ps, 該工具包的版本從0.9.15一下跳到3.0, 其跨度之大...hoho). 可以下載mole-init-tools-3.0.tar.gz源碼包的地方有兩個:
Rusty's Linux Kernel Page:

接下來, 按照下列步驟安裝mole-init-tools工具包:
復制內容到剪貼板代碼:
# configure --prefix=/
# make moveold
# make all install
# ./generate-modprobe.conf /etc/modprobe.conf
命令"make moveold"將把系統原來的motils工具程序改名為"*.old"(比如,lsmod.old等等). NOTE! 這是非常重要的一步, 千萬不要省略. 這將使得你可以繼續使用原有的linux-2.4.x系統, 因為在2.4.x系統下, 新的mole-init-tools工具包實際上是倚賴原來"*.old"程序來載入內核模塊. 如果忘記了這一步也不要緊張, 可以先下載並安裝原來的motils程序包, 然後按照上面的步驟重來一遍就可以了.
新的mole-init-tools工具包不再使用原來的/etc/moles.conf配置文件了, 而是使用新的配置文件/etc/modprobe.conf. 因此必需用命令"./generate-modprobe.conf /etc/modprobe.conf"來生成新的配置文件/etc/modprobe.conf. 但是令人不爽的是, 這個生成的新配置文件存在BUG, 下面我們將會提到.

⑧ 如何使用android的ndk編譯器 編譯c++的庫

1. 概述 首先回顧一下 Android NDK 開發中,Android.mk 和 Application.mk 各自的職責。 Android.mk,負責配置如下內容: (1) 模塊名(LOCAL_MODULE) (2) 需要編譯的源文件(LOCAL_SRC_FILES) (3) 依賴的第三方庫(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES) (4) 編譯/鏈接選項(LOCAL_LDLIBS、LOCAL_CFLAGS) Application.mk,負責配置如下內容: (1) 目標平台的ABI類型(默認值:armeabi)(APP_ABI) (2) Toolchains(默認值:GCC 4.8) (3) C++標准庫類型(默認值:system)(APP_STL) (4) release/debug模式(默認值:release) 由此我們可以看到,本文所涉及的編譯選項在Android.mk和Application.mk中均有出現,下面我們將一個個詳細介紹。 2. APP_ABI ABI全稱是:Application binary interface,即:應用程序二進制介面,它定義了一套規則,允許編譯好的二進制目標代碼在所有兼容該ABI的操作系統和硬體平台中無需改動就能運行。(具體的定義請參考 網路 或者 維基網路 ) 由上述定義可以判斷,ABI定義了規則,而具體的實現則是由編譯器、CPU、操作系統共同來完成的。不同的CPU晶元(如:ARM、Intel x86、MIPS)支持不同的ABI架構,常見的ABI類型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。 這就是為什麼我們編譯出來的可以運行於Windows的二進製程序不能運行於Mac OS/Linux/Android平台了,因為CPU晶元和操作系統均不相同,支持的ABI類型也不一樣,因此無法識別對方的二進製程序。 而我們所說的「交叉編譯」的核心原理也跟這些密切相關,交叉編譯,就是使用交叉編譯工具,在一個平台上編譯生成另一個平台上的二進制可執行程序,為什麼可以做到?因為交叉編譯工具實現了另一個平台所定義的ABI規則。我們在Windows/Linux平台使用Android NDK交叉編譯工具來編譯出Android平台的庫也是這個道理。 這里給出最新 Android NDK 所支持的ABI類型及區別: 那麼,如何指定ABI類型呢?在 Application.mk 文件中添加一行即可: APP_ABI := armeabi-v7a //只編譯armeabi-v7a版本 APP_ABI := armeabi armeabi-v7a //同時編譯armeabi,armeabi-v7a版本 APP_ABI := all //編譯所有版本 3. LOCAL_LDLIBS Android NDK 除了提供了Bionic libc庫,還提供了一些其他的庫,可以在 Android.mk 文件中通過如下方式添加依賴: LOCAL_LDLIBS := -lfoo 其中,如下幾個庫在 Android NDK 編譯時就默認鏈接了,不需要額外添加在 LOCAL_LDLIBS 中: (1) Bionic libc庫 (2) pthread庫(-lpthread) (3) math(-lmath) (4) C++ support library (-lstdc++) 下面我列了一個表,給出了可以添加到「LOCAL_LDLIBS」中的不同版本的Android NDK所支持的庫: 下面是我總結的一些常用的CFLAGS編譯選項: (1)通用的編譯選項 -O2 編譯優化選項,一般選擇O2,兼顧了優化程度與目標大小 -Wall 打開所有編譯過程中的Warning -fPIC 編譯位置無關的代碼,一般用於編譯動態庫 -shared 編譯動態庫 -fopenmp 打開多核並行計算, -Idir 配置頭文件搜索路徑,如果有多個-I選項,則路徑的搜索先後順序是從左到右的,即在前面的路徑會被選搜索 -nostdinc 該選項指示不要標准路徑下的搜索頭文件,而只搜索-I選項指定的路徑和當前路徑。 --sysroot=dir 用dir作為頭文件和庫文件的邏輯根目錄,例如,正常情況下,如果編譯器在/usr/include搜索頭文件,在/usr/lib下搜索庫文件,它將用dir/usr/include和dir/usr/lib替代原來的相應路徑。 -llibrary 查找名為library的庫進行鏈接 -Ldir 增加-l選項指定的庫文件的搜索路徑,即編譯器會到dir路徑下搜索-l指定的庫文件。 -nostdlib 該選項指示鏈接的時候不要使用標准路徑下的庫文件 (2) ARM平台相關的編譯選項 -marm -mthumb 二選一,指定編譯thumb指令集還是arm指令集 -march=name 指定特定的ARM架構,常用的包括:-march=armv6, -march=armv7-a -mfpu=name 給出目標平台的浮點運算處理器類型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16 -mfloat-abi=name 給出目標平台的浮點預算ABI,支持的參數包括:「soft」, 「softfp」 and 「hard」

⑨ 用gcc怎麼編譯出真正的位置無關的代碼

gcc test.c 的意思是直接生成a.out gcc test1.c 也是直接生成a.out 但是是會替換前一個的a.out 如果不放心你可以指定生成的名字 例如: gcc test.c -o aaa gcc test1.c -o bbb 這樣執行aaa就是test代碼了 執行bbb就是test1代碼了

熱點內容
安卓手機微信緩存文件在哪個文件夾 發布:2025-03-28 22:59:00 瀏覽:994
織夢是php嗎 發布:2025-03-28 22:58:22 瀏覽:624
資料庫兩張表關聯 發布:2025-03-28 22:52:49 瀏覽:727
冒險島2伺服器地址 發布:2025-03-28 22:50:20 瀏覽:612
修改phpini重啟 發布:2025-03-28 22:34:48 瀏覽:878
php俗稱 發布:2025-03-28 22:17:08 瀏覽:416
c語言棧的表達式求值 發布:2025-03-28 22:12:04 瀏覽:810
安卓天氣預報源碼 發布:2025-03-28 21:25:32 瀏覽:843
愛華仕密碼鎖怎麼設置 發布:2025-03-28 21:13:04 瀏覽:342
附件簡歷上傳失敗 發布:2025-03-28 20:57:07 瀏覽:503