導航:首頁 > 源碼編譯 > 源碼編譯依賴

源碼編譯依賴

發布時間:2023-03-18 06:29:05

① 如何解決源碼包安裝時的依賴性問題

不管是初步跨入linux殿堂的新手,還是具有多年經驗的專家,在安裝或編譯軟體包的過程中或多或少的都會遇到包的依賴問題,從而導致安裝過程無法繼續,比如管理員在安裝LAMP時,包需要libgd.so文件,而這個文件屬於GD軟體包。但是在安裝GD軟體包時,可能這個軟體包跟其他軟體包又具有依賴關系,又需要安裝其他軟體包才行。這時有的管理員便失去耐心。在遇到這種Linux軟體包依賴關系問題時,該如何解決呢?在談這個具體的措施之前,先跟大家聊聊Linux系統里的軟體依賴性問題。
一、什麼是依賴性耐喚明
程序依賴於程序代碼的共享庫,以便它們可以發出系統調用將輸出發送到設備或打開文件等(共享庫存在於許多方面,而不只局限於系統調用)。沒有共享庫,每次程序員開發一個新的程序,每個程序員都需要從頭開始重寫這些基本的系統操作。當編譯程序時,程序員將他的代碼鏈接到這些庫。如果鏈接是靜態的,編譯後的共享庫對象代碼就添加到程序執行文件中;如果是動態的,編譯後的共享庫對象代碼只在運行時需要它時由程序員載入。動態可執行文件依賴於正確的共享庫或共享對象來進行操作。rpm依賴性嘗試在安裝時強制實施動態可執行文件的共享對象需求,以便在以後當程序運行時不會有與動態鏈接過程有關的任何問題。
注意:還有一種類型的依賴性,它基於顯式的條目,rpm通過程序員將該依賴性強加到rpm配置文件中,但目前我們不關心這種類型的依賴性,這種依賴性比較容易解決。這里將重點放在rpm強制實施的更加復雜的共享對象依賴性。
二、動態可執行文件和共享對象
動態可執行文件使用最初編譯和鏈接程序時使用的庫文件的共享對象名稱來查找共享對象。它們在少數的幾個標准位置查找,比如在/lib和/usr/lib目錄及在LD_LIBRARY_PATH環境變數(主要用於指定查找共享庫,比如我們在安裝Oracle時指定路徑,exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib)指定的目錄中。順便提一下,在這些庫目錄中找到的共享對象可能不是真正的文件;它們可能是指向位於其他位置的真實庫文件的符號鏈接(但通常仍舊在標准庫目錄的一個目錄中)。至少從系統管理員的觀點是在用於創建共享庫文件的共享庫軟體包的名稱和共享庫文件的名稱之間通常沒有什麼關系。例如,GLIBC2.3軟體包用於創建libc.so.6共享庫文件。也從本示例中注意到,添加到共享庫文件名結束的版本號(.6)跟用於創建它的版本號(2.3)沒有關系。這是由共享庫軟體包開發人員有意完成的,以便GLIBC的新版本可以重用相同的共享庫文件名libc.so.6。這允許您在系統上載入新版本的GLIBC,而不用中斷動態鏈接到lib.so.6共享庫文件的所有昌告程序,當然假定新版本的GLIBC向後與動態可執行文件最初所鏈接的老版本GLIBC兼容。因此,即使庫文件或共享對象文件有與它們相關的版本號,這些版本號也不能幫助你確定他們來自哪個版本的共享軟體包。
注意:當將whatprovides選項用於rpm查詢命令時,可以獲得有關使用rpm軟體包載入到系統的現有共享對象的信息。這種混亂是由下面的事實造成的:單個共享庫文件可能支持某個范圍的共享庫軟體包版本。例如,要檢查soname庫文件/lib/libc.so.6支持的GLIBC共享庫軟體包,運行下面的鏈叢命令:
#objmp--all-headers/lib/libc.so.6|less
向下滾動此報告,直到到達Versiondefinitions:部分,以便查看libc.so.6共享庫文件支持哪些GLIBC版本:
Versiondefinitions:
10x010x0865f4e6libc.so.6
20x000x0d696910GLIBC_2.0
30x000x0d696911GLIBC_2.1
GLIBC_2.0
40x000x09691f71GLIBC_2.1.1
GLIBC_2.1
50x000x09691f72GLIBC_2.1.2
GLIBC_2.1.1
60x000x09691f73GLIBC_2.1.3
GLIBC_2.1.2
70x000x0d696912GLIBC_2.2
GLIBC_2.1.3
80x000x09691a71GLIBC_2.2.1
GLIBC_2.2
90x000x09691a72GLIBC_2.2.2
GLIBC_2.2.1
100x000x09691a73GLIBC_2.2.3
GLIBC_2.2.2
110x000x09691a74GLIBC_2.2.4
GLIBC_2.2.3
120x000x09691a76GLIBC_2.2.6
GLIBC_2.2.4
130x000x0d696913GLIBC_2.3
GLIBC_2.2.6
140x000x09691972GLIBC_2.3.2
GLIBC_2.3
150x000x09691973GLIBC_2.3.3
GLIBC_2.3.2
160x000x09691974GLIBC_2.3.4
GLIBC_2.3.3
170x000x0d696914GLIBC_2.4
GLIBC_2.3.4
180x000x0d696915GLIBC_2.5
GLIBC_2.4
190x000x0963cf85GLIBC_PRIVATE
GLIBC_2.5
200x000x0b792650GCC_3.0
在本示例中,1ibc.so.6共享庫文件支持原先為GLIBC版本2.0到2.5而開發的所有動態執行文件。注意:也可以使用objmp命令來從共享庫文件中提取soname,命令如下所示:
#objmp--all-headers/lib/libcrypto.so.0.9.8b|grepSONAME
SONAMElibcrypto.so.6
objmp:/lib/libcrypto.so.0.9.8b:
接下來,將討論rpm軟體包是如何生成的,以便在新系統上安裝rpm軟體包時,這些共庫依賴性是己知的。
三、Rpm軟體包和共享庫依賴性
當程序員生成rpm軟體包時,ldd命令用於報告動態可執行文件軟體包中所有動態可執行文件使用的所有共享庫。另一個混亂是由下面的事實帶來的:相同軟體包中的不同動態可執行文件可能與相同的共享庫軟體包的不同版本進行鏈接。例如,Heartbeat軟體包中的不同程序可能已經進行了開發,並動態鏈接到libc.so.6sonmae共享庫文件的不同GLIBC版本。對rpm命令使用-q和--requires參數,可以看到rpm軟體包需要的共享庫的完整清單。例如,要看到Heartbeatrpm軟體包所有的所需依賴性,請使用命令:
#rpm-q--requires-pheartbeat-1.x.x.i386.rpm
這產生了下面的報告:
sysklogd
/bin/sh
/bin/sh
/usr/bin/python
ld-linux.so.2
libapphb.so.0
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
libccmclient.so.0
libdl.so.2
libglib-1.2.so.0
libhbclient.so.0
libpils.so.0
libplumb.so.0
libpthread.so.0
librt.so.1
libstonith.so.0
注意,在此報告中,libc.so.6soname是所需要的,此共享庫必須支持使用GLIBC共享軟體包版本號2.0、2.1、2.1.3、2.2和2.3進行鏈接的動態可執行文件。這是由下面的事實決定的:Heartbeat軟體包中的不同動態可執行文件是針對不同版本的libc.so.6庫的每個版本進行鏈接的。在了解了動態可執行文件、共享對象、soname和共享庫軟體包彼此是如何相關的後,下面准備來看這樣的一個例子:當嘗試安裝rpm軟體包,並且它由於依賴性錯誤而失敗時,會發生什麼。yum能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關系,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。
四、手工解決依賴性問題
通常,當嘗試安裝發行版中沒有包括的軟體包(及不能由像up2date、apt-get或Yum一樣的更新工具自動解決其依賴性的軟體包)時,將碰到rpm依賴性錯誤。例如,如果嘗試在老的Linux發行版上使用rpm–ivh*rpm命令,例如所有的Heartbeatrpm包,那麼在安裝過程中就可能碰到下面的錯誤:
error:faileddependencies:
libc.so.6(GLIBC_2.3)isneededbyheartbeat-1.x.x
libc.so.6(GLIBC_2.3)isneededbyheartbeat-pils-1.x.x
libcrypto.so.0.9.6isneededbyheartbeat-stonith-1.x.x
libsnmp-0.4.2.6.soisneededbyheartbeat-stonith-1.x.x
注意,rpm命令沒有干擾報告所需的每個GLIBC共享庫軟體包版本號——它只報告所需的最高編號的版本號(GLIBC_2.3)。(假定原來的軟體包開發人員不會將相同軟體包中的可執行文件鏈接到不兼容版本的共享庫軟體包)所有的這些故障都報告所需的共享庫名稱或soname(而不是文件名稱,soname始終以「lib」開始)。但可以刪除添加到rpm報告的soname結束的版本號,並快速檢查以查看是否在系統中使用locate命令安裝這些共享庫(假設您的locate資料庫是最新的,有關更多信息,請參閱locate或slocate的手冊頁)。例如,要查找libcrypto享庫文件,要輸入:
#locatelibcrypto
[root@localhost~]#locatelibcrypto
/lib/libcrypto.so.0.9.8b
/lib/libcrypto.so.6
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/libcrypto.a
/usr/lib/libcrypto.so
/usr/lib/pkgconfig/libcrypto.pc
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
如果此命令沒有在系統上找到一個libcrypto共享庫文件,將需要轉到Internet並找出哪個共享庫軟體包包含此共享庫文件。完成此項工具的一個快速和簡便方式是只要在http://rpmfind.net上將共享庫的名稱輸入到搜索欄中。如果將文本libcrypto.so輸入到此搜索貞中,將很快知道此共享庫是由openssl軟體包提供的。

如果老版本的共享庫數據包已經安裝在系統上,可以用如下的命令確認此軟體包含您需要的共享庫文件:
#rpm-q--providesopenssl
[root@localhost~]#rpm-q--providesopenssl
config(openssl)=0.9.8b-10.el5
lib4758cca.so
libaep.so
libatalla.so
libchil.so
libcrypto.so.6
libcswift.so
libgmp.so
libnuron.so
libssl.so.6
libsureware.so
libubsec.so
openssl=0.9.8b-10.el5
此命令報告此rpm軟體包中提供的所有內容(這包括軟體包提供的共享庫文件的soname)。注意:如前面指出的,共享庫軟體包版本號沒有並且應該沒有與共享庫文件(soname)版本號的任何對應關系。這里不進行這方面的討論,因為soname符號鏈接可能指向不同版本的共享庫文件,這也是在盡量避免在安裝新版本的共享軟體包時中斷現有動態可執行文件的情況下完成的。
五、自動解決依賴性故障
當您使用rpm軟體包來生成、升級或添加新的特性到系統時,依賴性故障可能很快變成一場惡夢。只要通過使用您的發行版供應商的升級服務或工具,就可以避免這場惡夢。例如,當選擇要安裝的rpm軟體包時,RedHat工具up2date自動從RedHat下載並安裝所有rpm依賴性。下面就點上列出了幾個完成相同事情的支持社區的免費方法:http://www.rpm.org/。下面將只進一步看到這些自動更新工具中的一種:Yum。
1.使用Yum來安裝rpm軟體包
Yum(YellowdogUpdater,Modified)程序可從下面網址下載:http://yum.baseurl.org/download/3.4/yum-3.4.3.tar.gz
在下載了此軟體包後,可以使用下面的命令像任何其他rpm軟體包那樣安裝它:
#rpm-ivhyum*
您可能需要更新想用於下載您的rpm軟體包的存儲庫。有關Fedora的可用Yum存儲庫的清單在http://www.fedoratracker.org要切換到不同的存儲庫,下載這些文件中的一個文件,並將該文件作為/etc/yum.conf文件安裝。現在可以用下面的命令告訴Yum報告存儲在Yum存儲庫中、可用於安裝所有軟體包:
#yumlist
[root@localhost~]#yumlist|more
.
RHNsupportwillbedisabled.
Loading"security"plugin
Loading"rhnplugin"plugin
InstalledPackages
Deployment_Guide-en-US.noarch5.2-9installed
Deployment_Guide-zh-CN.noarch5.2-9installed
Deployment_Guide-zh-TW.noarch5.2-9installed
GConf2.i3862.14.0-9.el5installed
GConf2-devel.i3862.14.0-9.el5installed
ImageMagick.i3866.2.8.0-4.el5_1.1installed
MAKEDEV.i3863.23-1.2installed
MySQL-python.i3861.2.1-1installed
NetworkManager.i3861:0.6.4-8.el5installed
NetworkManager-glib.i3861:0.6.4-8.el5installed
2.用Yum安裝新的rpm軟體包
在本示例中,將安裝新的GLIBC軟體包。用簡單的命令安裝最新的GLIBC及其所有依賴性:
#yumupdateglibc
如果一切正常,Yum程序將自動檢測、下載並安裝最新GLIBC軟體包所需要的所有rpm軟體包(這里的GLIBC軟體包是為您的發行版而構建的,不一定是可用的最新版GLIBC軟體包(使用發行版所批準的GLIBC共享庫軟體包版本號或冒險安裝沒有使用正常系統操作所需要的動態可執行文件的GLIBC軟體包版本)。也可以將list參數用於Yum和grep命令來查找要安裝的軟體包。例如,要查找名稱中有SNMP的軟體包,請輸入:
#yumlist|grepsnmp
此命令返回如下報告:
.
RHNsupportwillbedisabled.
net-snmp.i3861:5.3.1-24.el5installed
net-snmp-libs.i3861:5.3.1-24.el5installed
net-snmp-perl.i3861:5.3.1-24.el5installed
net-snmp-utils.i3861:5.3.1-24.el5installed
現在可以容易地使用YUM下載並安裝所有這些rpm軟體包。
六、關於升級Gilbc的建議
Glibc庫是Linux底層的運行庫,其性能對於整個系統的運行有重要的意義。Glibc庫包含了大量函數,其中的函數可大致分成兩類,一類是與操作系統核心溝通的系統調用介面,它們作為功能型函數被調用,提供對Linux操作系統調用的包裝與預處理。另外一類為一般的函數對象,它們提供了經常使用的功能的實現,作為工具型函數使用。在實踐中,有不少軟體就是依賴與Glibc版本才能安裝並運行,說白了對於Glibc版本要求是版本高了不行,低了還不成。這些編譯環境中的應用程序也和其它程序一樣必須有運行的環境,我常遇到管理員在生產中給伺服器裝了最新的Linux發行版,結果應用軟體裝不上去,原因是Glibc的版本不對,有的是寫在原發行版glibc上升級有的是降級,結果倒是整個系統的崩潰,實踐經驗告訴我,你只有選擇相應Linux發行版里對應的glibc,例如我們單位的一個應用軟體時在rhel3.0下開發的,那麼就得要對應的發行版,換了別的就難說了,任何自己升級或降級Glibc來適應應用軟體的做法都是不可取的,問題最後的解決方法是找到了RHEL3裝上就解決了。在表一中,我把幾個linux發行版原配的Glibc版本列出,供大家參考。
點擊圖片查看大圖

Glibc庫與核心功能組件
上圖一說明:
GCC依賴於glibc
binutils依賴於glibc(binutils提供了一系列用來創建、管理和維護二進制目標文件的工具程序,如匯編(as)、連接(ld)、靜態庫歸檔(ar)、反匯編)
make依賴於glibc
頭文件是在編譯時候gcc所需要的,但本身都是一些文本文件,因此沒有需要的運行環境。
常用工具依賴於glibc和各種需要用到的動態庫。
下表一列出了多個重要Linux發行版的Glibc的情況
Linux發行版Glibc版本
Redhat9glibc-2.3.2-5
Fedora1glibc-2.3.2
RedhatEnterpriseLinuxAs3glibc-2.3.2-95
RedhatEnterpriseLinuxAs4glibc-2.3.4
RedhatEnterpriselinux5glibc-2.5-24
RedhatEnterpriselinux6glibc-2.9
Centos5.xglibc-2.5
-2.3.2-92
-2.4.31.54
-2.9

點擊圖片查看大圖

Linux發行版glibc(32)位
下面介紹幾個查詢glibc版本號的方法:
#ls–al/lib/libc*
或者是用下面的命令也可以實現
#rpm–qp|grepglibc
基於debian的系統通過dpkg–l|greplibc6也可以查到,總之一般都在/usr/share/doc目錄下都能看到glibc的相關信息。
七、小結
大部分情況下,在遇到軟體包依賴關系問題的時候,操作系統提供的文件名字與軟體包名字都會有直接的聯系。有可能文件的名字就是軟體包的名字。但是有些時候文件的名字與軟體包的名字會相差甚遠。此時大部分系統管理員可能光憑文件名字無法找到對應的軟體包。此時可以先在系統安裝光碟里找,如果找到那時最佳選項,然後就需要藉助筆者上面談到的一些專業網站,去查詢軟體包的名字了。當系統管理員安裝了某個軟體之後,如果存在軟體包之間的依賴關系,則最好能夠拿本子或者通過其他手段記錄下來。以便下次方便實用,注意工作中的積累,相信絕大部分的軟體包依賴關系問題都會迎刃而解。

② 關於LINUX如何解決依賴包問題

沒那麼困難飢陸手。。。通常安裝它的提示一個一個包的安裝就行

另外看看源碼中帶的README,會有幫助

openssl gzip這爛嫌悉賀些都可以apt-get的

③ 如何查看android系統源碼編譯依賴jdk版本

因為1.4的有些寫法在1.6下是被認為不安全的,所銀悔哪以前型被禁用了
要麼是按照提示,在JCreator的編譯鋒碼選項中加入 -Xlint:unchecked重做
要麼就是把JDK換成1.4的

④ 新人求教 驅動源碼編譯安裝

1、安裝scons
(1) 下載python2.7, 使用x86_32位,因為scons只有32位安裝包可用;
(2) 下載scons2.3.0;
(3) 安裝python 和 scons, 將C:\Python27\Scripts寫入PATH;
(4) 下載安裝pywin32 ,It is recommended you install pywin32 if you want to do parallel builds (scons -j)

2、安裝boost庫(1.49版本).
解壓後雙擊bootstrap.bat,生成bjam.exe後,cd到目錄c:\boost下,(將boost_1_49更名為boost了)編譯boost。
編譯命令:C:\boost>bjam variant=release --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32
這是使用VS2010環境編譯的release版本,編譯完成後,生成C:\boost\stage\lib文件夾,下面有6個lib庫:

如果要編譯成debug版本,使用命令:bjam variant=debug --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32

編譯完成後,生成C:\boost\stage\lib文件夾,下面有10個lib庫和dll:

此處為MongoDB文檔中對於編譯boost庫的要求原文:
When using bjam, MongoDB expects
variant=debug for debug builds, and variant=release for release builds
threading=multi
link=static runtime-link=static for release builds
address-model=64 for 64 bit(64位的話,把32換為64)。link=static runtime-link=static,boost需要編譯成靜態庫,因為mongodb只會去鏈接boost的靜態庫
address-model=64在win7 64環境下此項必須,不加在編譯mongodb的c++ client時會出現鏈接錯誤。

3、下載mongo2.4.6源碼 http://www.mongodb.org/downloads官網下載
編譯Mongoclient.lib

cmd命令提示符下,cd到解壓後的文件目錄,例如我放在了E盤,E:\mongodb-src-r2.4.6,輸入命令:
scons –-dd --32 mongoclient.lib // build C++ client driver library
Add --64 or --32 to get the 64- and 32-bit versions, respectively. Replace --release with --dd to build a debug build.
編譯後在mongodb\build\win32\32\dd\client_build\生成mongoclient.lib.

4、測試程序
就用Mongodb自帶的例子吧,使用VS2010打開E:\mongodb-src-r2.4.6\src\mongo\client\examples中的simple_client_demo.vcxproj,編譯,會提示生成simple_client_demo.sln,保存。
使用debug模式,配置工程環境:打開工程->屬性,配置Configuration Properties下的VC++ Directories,頭文件路徑添加C:\boost,Lib庫路徑添加boost的lib,以及mongodb client的lib:
C:\boost\stage\lib

E:\mongodb-src-r2.4.6\build\win32\32\dd\client_build
進入C/C++下面的Code Generation,將Runtime Library設置為Multi-threaded Debug (/MTd)
進入Linker下面的Input,設置Additional Dependencies,添加ws2_32.lib,psapi.lib,Dbghelp.lib,mongoclient.lib
將E:\mongodb-src-r2.4.6\build\win32\32\dd\mongo\base下生成的error_codes.h和error_codes.cpp文件,拷貝到E:\mongodb-src-r2.4.6\src\mongo\base目錄下。
ok,編譯、運行.

5、問題解決
error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(dbclient.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(assert_util.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(jsobj.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(status.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(mutexdebugger.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj

VS的版本不匹配,lib是在更高級的版本中編譯生成的,而使用的時候,是在低級版本中使用的,所以出現了不匹配的錯誤。例如,我在VS2010 SP1和VS2012的環境下編譯的,而使用是在VS2010上使用,所以在編譯時,出現了以上問題。

1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymCleanup
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymGetMoleInfo64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymInitialize
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_StackWalk64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymFromAddr

在工程依賴庫中添加Dbghelp.lib

其它問題,看看你手頭的編譯器、編譯出來的boost庫版本、mongoclient.lib的版本,是否對應好了。

⑤ fedora中,如何讓之後安裝的軟體在解決依賴時可以發現識別源碼編譯的軟體

沒有辦法,因為 rpm 的資料庫裡面只保存 rpm 安裝的軟體包。
這種情況,要麼自己手動修改 rpm 的悄清枝資料庫正畢加上啟敏自己安裝程序相關文件和各種信息,要麼自己做個 rpm 安裝。

⑥ 求解答,Android源碼編譯時怎的添加第三方jar包

Android.mk添加第三方jar包

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_java_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := test

LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xsocket:lib/xSocket-2.8.14.jar \
jackson-mapper:lib/jackson-mapper-asl-1.6.2.jar \
logging:lib/commons-logging.jar \
jackson-core:lib/jackson-core-asl-1.6.2.jar \
javatar:lib/javatar-2.5.jar \
log4j:lib/log4j-1.2.15.jar
include $(BUILD_MULTI_PREBUILT)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

以上是我的一個項目中所需要的第三方jar包,主要參考了Android源碼中的Calculator應用,該應用也引用了一個第三方的jar包arity-2.1.2.jar。
需要注意的是,當你要引用的jar包不止一個時,有兩個關鍵的地方需要注意的。
LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xsocket:lib/xSocket-2.8.14.jar \
jackson-mapper:lib/jackson-mapper-asl-1.6.2.jar \
logging:lib/commons-logging.jar \
jackson-core:lib/jackson-core-asl-1.6.2.jar \
javatar:lib/javatar-2.5.jar \
log4j:lib/log4j-1.2.15.jar
xsocket jackson-mapper logging jackson-core javatar log4j這幾個只是名字,可以隨便取。LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES後面才是真正其作用的地方。如:
xsocket:lib/xSocket-2.8.14.jar 引用的是lib目錄中的xSocket-2.8.14.jar。
還要注意的是 := 不要寫成了+=了哦。

附:編寫各種類型的Android.mk,出處我忘記了,是以前瀏覽是拷貝下來的。
一、編譯一個簡單的APK
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
# Tell it to build an APK
include $(BUILD_PACKAGE)
二、編譯一個依賴靜態.jar文件的APK
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# List of static libraries to include in the package
LOCAL_STATIC_JAVA_LIBRARIES := static-library
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
# Tell it to build an APK
include $(BUILD_PACKAGE)
註:LOCAL_STATIC_JAVA_LIBRARIES 後面應是你的APK程序所需要的JAVA庫的JAR文件名。
三、編譯一個需要platform key簽名的APK
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
LOCAL_CERTIFICATE := platform
# Tell it to build an APK
include $(BUILD_PACKAGE)
註:LOCAL_CERTIFICATE 後面應該是簽名文件的文件名
四、編譯一個需要特殊vendor key簽名的APK
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
LOCAL_CERTIFICATE := vendor/example/certs/app
# Tell it to build an APK
include $(BUILD_PACKAGE)
五、裝載一個普通的第三方APK
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Mole name should match apk name to be installed.
LOCAL_MODULE := LocalMoleName
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
六、裝載需要.so(動態庫)的第三方apk
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := input_android_v1.1_1000e
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
#################################################################
####### the library to /system/lib #########################
#################################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libinputcore.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
LOCAL_SRC_FILES := lib/$(LOCAL_MODULE)
OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
include $(BUILD_PREBUILT)
七、編譯一個靜態java庫
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Any libraries that this library depends on
LOCAL_JAVA_LIBRARIES := android.test.runner
# The name of the jar file to create
LOCAL_MODULE := sample
# Build a static jar file.
include $(BUILD_STATIC_JAVA_LIBRARY)
註:LOCAL_JAVA_LIBRARIES表示生成的java庫的jar文件名。

⑦ linux平台下,nginx源碼包如何安裝需要哪些依賴 RHEL5

要看你原有的系統安裝了哪些包。
先編譯,會有錯誤提示,提示少什麼就裝什麼。

或者直接yum,系統會自動安裝依賴包,然後再卸載,自己源碼編譯nginx

⑧ 在配置gcc時發現一個問題。我是源碼編譯的,目的只是學習學習編譯技巧。gcc依賴於gmp,mpfr,

不是啊,

⑨ 怎麼源碼編譯依賴LAPACK和ATLAS庫的NumPy包

1. GCC版本要求
使用較新版本的GCC工具集(盡量不低於v4.7)且集成有gfortran編譯器。
備注1:這里大寫的"GCC"是指GNU Compiler Collection,它除包含C語言編譯器gcc外,還包含很多其它語言的編譯器(如g++/gfortran等)
備注2:3.x版的的C語言編譯器gcc會由於某些頭文件缺失導致編譯atlas庫報錯
備注3:若GCC工具集中沒有gfortran編譯器,則編譯lapack庫時會遇到一些莫名其妙的錯誤(因為lapack是用fortran編寫的),好在GCC4.7及以上版本中已經集成了gfortran編譯器
在GCC版本符合要求的前提下,臨時將其加入環境變數PATH並設置動態庫查找路徑:
[plain] view plain
在CODE上查看代碼片派生到我的代碼片
$ export PATH=/home/slvher/tools/gcc48/bin/:$PATH
$ export LD_LIBRARY_PATH=/home/slvher/tools/gcc48/lib64:/home/slvher/tools/gcc48/lib
備注4:在當前shell會話中臨時設置LD_LIBRARY_PATH可以保證編譯過程中正確搜索到GCC庫,但最好不要設置到.bash_profile中,因為那樣會影響其它程序的查找路徑,可能會踩到坑。
備注5:這里提到的GCC的版本要求及環境變數設置如果沒有出差錯,那麼下面的編譯會比較順利,否則會遇到各種編譯/鏈接問題,後續我會用一篇筆記來記錄這些踩坑的過程及遇到這些詭異問題時的分析思路,這里不贅述。
2. 編譯LAPACK和ATLAS庫
lapack是用fortran開發的經過特別優化的線性代數計算庫;atlas也是一個優化過的線性代數計算庫,它提供了BLAS庫的全部API(包括C介面和Fortran介面),還實現了lapack庫中的部分函數,atlas在編譯過程中會根據機器的配置參數來調整科學計算函數的參數,以便在該機器上達到更好的計算性能。
初看起來,需要分別編譯lapack和atlas兩個庫,所幸的是,atlas庫支持編譯時自動編譯lapack庫,因此,只需正確完成atlas庫的編譯配置,編譯atlas庫就可以了。
下面是編譯atlas/lapack庫的主要步驟。
1) 分別從官網下載lapack源碼包和atlas源碼包,我下載的是目前的最新版lapack-3.5.0.tgz及atlas3.10.2.tar.bz2
2) 解壓atlas源碼壓縮包:tar -jxvf atlas3.10.2.tar.bz2
3) cd ATLAS && mkdir BLDdir && cd BLDdir
4) 執行configure命令以配置編譯參數
[plain] view plain
在CODE上查看代碼片派生到我的代碼片
$ ../configure --shared -b 64 --prefix=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs --with-netlib-lapack-tarfile=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/lapack-3.5.0.tgz
其中,--shared表明要編譯atlas共享庫(configure會自動在編譯命令中插入"-fPIC"參數,無需在這里顯式指定);--prefix指定編譯結果的安裝路徑;--with-netlib-lapack-tarfile表明編譯atlas庫時會用相同的編譯器及編譯/鏈接參數自動編譯lapack庫,這里指定lapack源碼包的路徑後,configure運行後會自動解壓lapack源碼並將其拷貝至BLDdir/src/lapack/reference/這個目錄下。
5) configure運行完後,BLDdir目錄下生成了Make.inc文件,該文件中設置了眾多編譯參數(如查找路徑、編譯產出路徑、編譯器、傳給編譯器的參數,等等),BLDdir子目錄下很多模塊的Makefile都會include這個Make.inc,包括源碼獨立的lapack包,可見,這個Make.inc文件可以達到統一編譯環境的目的。
6) make build
7) make check
8) make ptcheck
9) make install
如果上述一系列命令均執行成功,那麼編譯完成的*.a和*.so庫會安裝到--prefix參數指定的路徑下,這些庫的頭文件也會被拷貝到安裝路徑下的include目錄。
至此,ATLAS和LAPACK庫均完成編譯,其中LAPACK庫是.a靜態庫,ATLAS庫是.so動態庫。事實上,ATLAS的動態庫中已經包含了LAPACK靜態庫的所有符號和代碼。
下面可以開始編譯依賴LAPACK和ATLAS庫的NumPy包了。
3. 編譯優化版NumPy包
前提:官網下載NumPy源碼包並解壓,這里以目前最新版numpy-1.9.2.tar.gz為例進行說明。
1) cd至解壓目錄numpy-1.9.2
2) cp site.cfg.example site.cfg
3) 在site.cfg中配置atlas項,其中include_dirs和library_dirs是atlas庫安裝路徑下的include和lib目錄
[plain] view plain
在CODE上查看代碼片派生到我的代碼片
[atlas]
atlas_libs = lapack,f77blas,cblas,atlas
library_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib
include_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include
4) python setup.py config
5) python setup.py build --fcompiler=gnu95 ## 指定Fortran編譯器為GCC4.8工具集中的gfortran
6) python setup.py install
正常情況下,build成功後,install會把編譯產出拷貝到當前python解釋器安裝路徑下的lib/python2.7/site-packages目錄中。
此時,可以通過下面的例子來查看NumPy包的配置情況:
[python] view plain
在CODE上查看代碼片派生到我的代碼片

>>>importnumpyasnp
>>>np.__config__.show()
atlas_3_10_blas_threads_info:
libraries=['lapack','f77blas','cblas','atlas']
library_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
define_macros=[('HAVE_CBLAS',None),('ATLAS_INFO','"\"3.10.2\""')]
language=c
include_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
lapack_opt_info:
libraries=['tatlas','lapack','f77blas','cblas','atlas']
library_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
define_macros=[('ATLAS_INFO','"\"3.10.2\""')]
language=f77
include_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
blas_opt_info:
libraries=['lapack','f77blas','cblas','atlas']
library_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
define_macros=[('HAVE_CBLAS',None),('ATLAS_INFO','"\"3.10.2\""')]
language=c
include_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
openblas_info:
NOTAVAILABLE
openblas_lapack_info:
NOTAVAILABLE
atlas_3_10_threads_info:
libraries=['tatlas','lapack','f77blas','cblas','atlas']
library_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
define_macros=[('ATLAS_INFO','"\"3.10.2\""')]
language=f77
include_dirs=['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
lapack_mkl_info:
NOTAVAILABLE
blas_mkl_info:
NOTAVAILABLE
mkl_info:
NOTAVAILABLE
也可以用具體的例子來驗證其功能是否正常:
[python]viewplain
在CODE上查看代碼片派生到我的代碼片
>>>importnumpyasnp
>>>np.arange(15).reshape(3,5)
array([[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14]])
>>>
>>>a=np.arange(15).reshape(3,5)
>>>a
array([[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14]])
>>>type(a)
<type'numpy.ndarray'>
>>>
>>>
>>>fromnumpy.linalgimport*
>>>b=np.array([[1.0,2.0],[3.0,4.0]])
>>>b
array([[1.,2.],
[3.,4.]])
>>>b.transpose()
array([[1.,3.],
[2.,4.]])
>>>inv(b)
array([[-2.,1.],
[1.5,-0.5]])
>>>

⑩ 有沒有人nifi的源碼編譯的完整依賴包啊

設好倉庫鏡像沒?

maven.aliyun.com代理了很多公共的maven倉庫。使用maven.aliyun.com中的倉庫地址作為下枝含載源,速度更快更穩定。

打隱漏開maven的配置文件(windows機器一般在maven安裝目錄的conf/settings.xml),在<mirrors></mirrors>標灶搭爛簽中添加mirror子節點:


<mirror>

<id>aliyunmaven</id>

<mirrorOf>*</mirrorOf>

<name>阿里雲公共倉庫</name>

<url>https://maven.aliyun.com/repository/public</url>

</mirror>


參考阿里雲倉庫服務

閱讀全文

與源碼編譯依賴相關的資料

熱點內容
如何查看伺服器系統版本信息 瀏覽:512
成都市土地出讓金演算法 瀏覽:702
鋼筋加密標記 瀏覽:575
ps中擴展功能在文件夾的什麼位置 瀏覽:903
雙極壓縮機為什麼要先高壓 瀏覽:527
蘋果手機伺服器填什麼 瀏覽:832
android移動動畫效果 瀏覽:691
電子和伺服器是什麼意思 瀏覽:691
phpurl中文亂碼問題 瀏覽:893
程序員那麼可愛大結局陸漓產子 瀏覽:538
java如何從雲伺服器讀取本地文件 瀏覽:923
壓縮空氣軟管製作方法 瀏覽:911
天河三號演算法 瀏覽:924
php隊列教程 瀏覽:632
洪水命令 瀏覽:529
安卓怎麼弄成蘋果在線 瀏覽:435
谷歌web伺服器地址 瀏覽:900
安卓鎖屏圖片如何刪除 瀏覽:721
python3多進程編程 瀏覽:715
證明代碼是程序員寫的 瀏覽:397