導航:首頁 > 源碼編譯 > msys2編譯的庫有依賴怎麼辦

msys2編譯的庫有依賴怎麼辦

發布時間:2023-05-14 23:19:32

1. 我編譯A靜態庫的時候依賴了B靜態庫,我編譯的程序依賴A靜態庫和B靜態庫,這樣B靜態庫是不是會有重復的部分

靜態庫在程序的鏈接階段被復制到了程序中。
你用依賴這睜臘個詞。
程序編譯一般需經預處理、編譯、匯編和鏈接幾個步驟。
在鏈接步驟中,靜斗租態庫才會被復制。
因為靜態庫在程序的鏈接階段被復制到了程序中,和程序運行的時候沒有關系。
存在幾個鏈接?
那麼就幾分拷貝。悉銷滑

2. spec文件不寫依賴的情況依然存在依賴庫

由於很多東西需要保密,所以不放截圖
rpm -qlp *.rpm 查看rpm包中攜帶的文件
ldd file 檢測編譯文件夾下的bin文件是否是bin文件帶來帶汪的依賴
vi /usr/lib/rpm/micro 編輯rpm的編譯宏
找到455,456行,注釋掉

重新編譯,使用 rpm -qpR *.rpm 檢測新生成的rpm是否帶有依賴
如果問題未被解決,則在spec文件Requires下絕笑面加入一行 AutoReqProv: no 來規避掉二進制文件並行含帶來的依賴

3. 怎樣解決maven里編譯時包的依賴有關問題

一、導出到默認目錄 targed/dependency
從Maven項目中導出項目依賴的jar包:進入工程pom.xml 所在的目錄下,執行如下命令

mvn dependency:-dependencies
或在eclipse中,選擇項目的pom.xml文件,點擊右鍵菜單中的Run As,見下圖紅框中,在彈出的Configuration窗口中,輸入 dependency:-dependencies後,點擊運行
maven項目所依賴的jar包會導出到targed/dependency目錄中。
二、導出到自定義目錄中
在maven項目下創建lib文件夾,輸入以下命令:

mvn dependency:-dependencies -DoutputDirectory=lib
maven項目所依賴的jar包都會復制到項目目錄下的lib目錄下
三、設置依賴級別
同時可以設置依賴級別,通常使用compile級別

mvn dependency:-dependencies -DoutputDirectory=lib -DincludeScope=compile

4. 如何自動解決rpmbuild編譯時出現的依賴問題

這只能說明一個問題,你依賴的庫本隱基銷身有問題,沒有把它的依鋒檔賴都加進去,也就是你例子中的①灶游libb.so依賴liba.so;,你應該在生成libb.so的時候,把對liba.so的依賴加進去,這樣應該就沒有問題了。

5. 安裝32位庫 lib32stdc++6提示依賴關系怎麼辦

檢查下系統兼容問題,有的abaqus版本與檔閉32位系統不兼容,今年好幾個同事都出現這種問題,我給重裝64位系統後就好了。建議你安裝64位系統,內存為4G以上,要是32位系統的話,4G內存只顯示攜李不到3G,以後做動力計算時,2G內存算不了,只能打行隱裂開計算結果。

6. 6.2、android Studio 添加編譯依賴

文章摘要
1、 三種依賴類型
2、庫依賴關系配置
3、遠程倉庫
4、查看依賴關系樹

英文文獻

Android Studio中的搖籃構建系統可以很容易地包括外部的二進制文件或其他庫模塊到您的構建與依賴。該依賴性可以位於您的計算機上或遠程倉庫中,他們宣布任何傳遞依賴將自動包括在內。

要添加一個依賴於你的項目,指定諸如依賴配置compile在dependencies您的塊build.gradle文件。

例如,下面build.gradle為應用模塊文件包括三種不同類型的依賴關系:

每個這些要求不同類型的依賴關系如下:

此聲明一有依賴性 的Android庫模塊 名為「在MyLibrary」(此名稱必須定義為庫名稱相匹配include你的 settings.gradle 文件)。它需要構建系統編譯庫模塊與應用模塊,並在您的APK所產生的AAR文件。

由於Gradle讀取相對路徑的build.gradle 文件,這告訴構建系統添加您的項目內的所有JAR文件 mole_name/libs/的目錄的依賴。
或者,您可以指定單獨的文件如下:

這實際上是以下簡寫:

這宣告了「應用程序魔」庫的12.3版本的依賴,在「code.example.android」命名空間組內。

內側dependencies塊,可以聲明使用幾種不同的一個庫依賴依賴關系配置(諸如compile上面示出)。每個相關配置提供了搖籃有關如何使用圖書館不同的指令。下面的列表描述了每個可使用在你的Android項目庫依賴的配置。

以上配置適用於項目的主要來源集,它適用於所有的構建變種。
如果你不是想聲明的依賴只有特定的 構建變數 源設置或更改一個 測試源設置 ,你必須利用配置名稱以及與構建變數或測試源集的名稱前綴它。

例如,在添加compile
依賴關系只為您的「免費」產品的風味(使用遠程二進制依賴),它看起來像這樣:

但是,如果你想添加一個依賴於結合了產品的風味變體和構建類型,那麼你必須初始化的配置名稱configurations塊。下面的示例增加了一個apk依賴於你的「freeDebug」打造變種(使用本地二進制依賴):

要添加compile為本地測試和儀表測試的依賴性,它看起來像這樣:

如果你的 庫模塊提供了多個變種 ,你可以添加不同的庫變體像這樣不同的應用程序變數:

當你的依賴比當地的圖書館或文件樹以外的東西,搖籃會在哪個在線存儲庫中指定的文件 repositories的塊build.gradle文件。

默認情況下,新的Android Studio項目申報JCenter作為該項目的頂級存儲庫位置build.gradle的文件,如下圖所示:

如果你想從Maven的中央倉庫的東西,然後再添加 mavenCentral(),或本地存儲庫使用mavenLocal():

參考配置:

有些直接依賴可能有自己的依賴。這些被稱為 傳遞依賴 。而不是要求您手動聲明每個傳遞依賴,搖籃自動收集,並增加了它們。為了形象化兩個項目的直接和傳遞依賴,對於搖籃的Android插件提供了生成依賴關系樹為每個搖籃任務 構建變數 和 測試源集合 。

要生成此報告,步驟如下:

下面的示例報告顯示調試構建變數的依賴關系樹,包括前面例子中的本地庫模塊依賴和遠程依賴性。

7. linux編譯一個動態庫,將所依賴的其他庫的頭文件包含了進來,但沒指定其他靜態庫的路徑和名稱

編弊帆譯能過。因為頭文件的聲明,表示在某個地方這野飢些租脊雹變數被定義了。既然被定義了,當然編譯能過。但是如果沒有那些庫,鏈接是不能過的。

8. Windows搭建MSYS2和MINGW64環境

為了在windows下編譯GDAL和Cesium Terrain Builder等軟體,需要搭建MSYS2和MINGW64的編譯環境

Windows Server 2012 R2
MSYS2 64位

雙擊安裝MSYS2之後,由於MSYS2默認資源站點速度較慢,可以配置國內 清華大學開源鏡像站褲鎮
安裝完成後,編輯 /etc/pacman.d/mirrorlist.mingw32 ,在文件開頭添加:

編輯 /etc/pacman.d/mirrorlist.mingw64 ,在文件開頭添加:

編輯 /etc/pacman.d/mirrorlist.msys ,在文件開頭添加:

然後執行 pacman -Sy 刷新軟體包數據即可。
配置國內鏡像站點後液純好,在shell裡面執行 pacman -Syuu 更新全部依賴

MSYS2內置了pacman包管理工具,運行
pacman -S gcc make
即可安裝gcc,make等工具

msys2安裝完成後,開始菜單會有三個啟動方式:

三種啟動方式區別主要在於編譯環境軟體包的不同,如gcc,clang等版本不同。通用的工具如:grep,git,vim,emacs等等在三種方式內都是一樣的。

默認情況下, msys64/home 會作為系統默鬧鉛認home目錄,如果需要修改home目錄,可在環境變數-》用戶變數中建立 Home 變數,指向自定義位置,然後修改 msys64/etc/nsswitch.conf ,設置 db_home: /%Home%

9. C# 工程 DLLimport 導入的庫若是有依賴庫怎麼辦

第一步,我先從簡單的調用出發,定義了一個簡單的函數,該函數僅僅實現一個整數加法求和:

LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 導入定義:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a,int b);
}
在C#中調用測試:

int iSum = RefComm.mySum(,);

運答仔行查看結果iSum為5,調清信汪用正確。第一步試驗完成,說明在C#中能夠調用自定義的動態鏈接庫函數。

第二步,我定義了字元串操作的函數(簡單起見,還是採用前面的函數名),返回結果為字元串:

LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a); return a;}
C# 導入定義:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中調用測試:

string strDest="";
string strTmp= RefComm.mySum("45", strDest);

運坦空行查看結果 strTmp 為"45",但是strDest為空。我修改動態鏈接庫實現,返回結果為串b:

LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a) return b;}
修改 C# 導入定義,將串b修改為ref方式:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再調用測試:

string strDest="";
string strTmp= RefComm.mySum("45", ref strDest);
運行查看結果 strTmp 和 strDest 均不對,含不可見字元。再修改 C# 導入定義,將CharSet從Auto修改為Ansi:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中再調用測試:

string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
運行查看結果 strTmp 為"45",但是串 strDest 沒有賦值。第二步實現函數返回串,但是在函數出口參數中沒能進行輸出。再次修改 C# 導入定義,將串b修改為引用(ref):

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}

運行時調用失敗,不能繼續執行。

第三步,修改動態鏈接庫實現,將b修改為雙重指針:

LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),"%s",a); return *b;}
C#導入定義:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中調用測試:

string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);

運行查看結果 strTmp 和 strDest 均為"45",調用正確。第三步實現了函數出口參數正確輸出結果。

第四步,修改動態鏈接庫實現,實現整數參數的輸出:

LIBEXPORT_API int mySum(int a,int b,int *c){ *c=a+b; return *c;}
C#導入的定義:

public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a, int b,ref int c);
}
在C#中調用測試:

int c=0;
int iSum= RefComm. mySum(,, ref c);

運行查看結果iSum 和c均為5,調用正確。

經過以上幾個步驟的試驗,基本掌握了如何定義動態庫函數以及如何在 C# 定義導入,有此基礎,很快我實現了變長加密函數在 C# 中的調用,至此目標實現。

三、結論

在 C# 中調用 C++ 編寫的動態鏈接庫函數,如果需要出口參數輸出,則需要使用指針,對於字元串,則需要使用雙重指針,對於 C# 的導入定義,則需要使用引用(ref)定義。

對於函數返回值,C# 導入定義和 C++ 動態庫函數聲明定義需要保持一致,否則會出現函數調用失敗。定義導入時,一定注意 CharSet 和 CallingConvention 參數,否則導致調用失敗或結果異常。運行時,動態鏈接庫放在 C# 程序的目錄下即可,我這里是一個 C# 的動態鏈接庫,兩個動態鏈接庫就在同一個目錄下運行。

10. 求助,依賴的動態庫包含靜態庫,編譯報錯說找

動態鏈接庫和靜態鏈接庫一般是編譯集成一系列的介面(函數)
在程序源代碼編譯完成後通過編譯器編譯並通過鏈接器與這些庫進行鏈接
動態鏈接庫與靜態鏈接庫的區別在於鏈接器在進行鏈接時靜態庫會被直接編譯進程序里
而動態鏈接庫並不會,我們這里將這些鏈接庫稱作依賴(動態庫和靜態庫)
程序的運行需要這些依賴,程序在靜態鏈接後該程序本身便已包含該依賴
而動態鏈接後的程序本身本不包含該依賴,這些依賴需要執行者自行安裝進操作系統(動態庫、運行時庫)
程序運行時會動態地載入這些庫

linux上動態庫一般的後綴後為.so
靜態庫一般的後綴為.a
由於靜態鏈接會直接將庫編譯進程序里所以靜態編譯後的程序相較於動態鏈接所要大
這就是因為靜態鏈接會將鏈接庫編譯進程序里的原因,所以佔用就要大了
出於這種原因,靜態庫不易於維護與更新,如果鏈接庫中有實現有bug等需要更新則需要更新整個程序,因為靜態庫被編譯進程序中了
但動態庫就沒有這種情況了,因為動態庫是程序運行時動態載入的,所以我們只需要更新動態庫而不需要更新所有依賴該庫的程序(軟體)

另一方面,很多程序的開發都會使用到相同的鏈接庫,也就是很多程序(軟體)會有相同的依賴
如果將這些依賴全部靜態編譯的話將會造成存儲資源佔用過多而造成資源浪費
而使用動態庫的方式這些程序(軟體)則可以共享一個鏈接庫,而不需要每個程序都帶一個鏈接庫,這樣就大大地減少了存儲資源佔用空間

閱讀全文

與msys2編譯的庫有依賴怎麼辦相關的資料

熱點內容
軟通動力程序員節2021 瀏覽:845
安卓系統如何卸載安裝包 瀏覽:870
簡訊刪除助手文件夾 瀏覽:688
java辦公自動化 瀏覽:340
php中超鏈接 瀏覽:253
linux默認路由設置 瀏覽:36
linux如何掛載iso 瀏覽:432
vs程序換文件夾後不能編譯 瀏覽:557
安卓源碼編譯輸入腳本沒反應 瀏覽:47
phpmysql自增 瀏覽:167
把ppt保存為pdf 瀏覽:533
汽車密封件加密配件 瀏覽:887
黑馬程序員15天基礎班 瀏覽:560
java調整格式 瀏覽:521
香港雲伺服器租用價 瀏覽:78
linuxsublime3 瀏覽:560
imac混合硬碟命令 瀏覽:278
沈陽用什麼app租房車 瀏覽:857
00後高中生都用什麼app 瀏覽:239
戴爾塔式伺服器怎麼打開獨立顯卡 瀏覽:808