1. 程序編譯成動態庫能正常運行而靜態庫卻不行!
我感覺問題不太清楚呢,有如下疑問。
1. 樓主是用的BREW4.0或之前的版本來開發的嗎?還是用的最新的Brew MP?
2. 用的模擬器還是下載到設備?
3. 一般不需要自己寫makefile 啊,因為開發brew app有很多固有的框架代碼,這些一般都由IDE上的插件幫忙生成,而且不需要自己構造命令編譯連接的。
我的開發環境是: VC6.0 sp6 + BREW sdk4.0 + ADS1.2 這個可以生成mod下載到手中。
還有另外一個環境:VC2008 + Brew MP 5.0 這個只能在模擬器上測試。
首先,如果不是Brew MP的話,要把程序做成靜態的只能和手機的代碼一起編譯成rom,下載到手機中,這個不能在模擬器上調試。
Brew MP封裝了OEM也就是我們無法直接修改手機代碼,所以它提供了上層編寫靜態程序的方法。
所以有些不太清楚你遇到的是那種情況。
一般來說MALLOC掛掉是分配的太大,這種情況很少,除非我故意去測試,真正開發的時候從來沒有遇到過,而且跟手機代碼一起開發的時候是可以用標准函數malloc的。也可以使用全局變數或靜態變數,動態的不可以。
說到makefile,編譯mod文件一用自己寫,尤其是用VC的時候,brew的插件幫我們寫好了,只要點一下就能進行ARM編譯和鏈接,即使是用ADS來編譯,也不需要自己寫。
有問題再聯系吧
2. C/C++編譯問題,靜態庫,動態庫。
g++ main.c -L. libalex.so -ltest
3. 求助,依賴的動態庫包含靜態庫,編譯報錯說找
動態鏈接庫和靜態鏈接庫一般是編譯集成一系列的介面(函數)
在程序源代碼編譯完成後通過編譯器編譯並通過鏈接器與這些庫進行鏈接
動態鏈接庫與靜態鏈接庫的區別在於鏈接器在進行鏈接時靜態庫會被直接編譯進程序里
而動態鏈接庫並不會,我們這里將這些鏈接庫稱作依賴(動態庫和靜態庫)
程序的運行需要這些依賴,程序在靜態鏈接後該程序本身便已包含該依賴
而動態鏈接後的程序本身本不包含該依賴,這些依賴需要執行者自行安裝進操作系統(動態庫、運行時庫)
程序運行時會動態地載入這些庫
linux上動態庫一般的後綴後為.so
靜態庫一般的後綴為.a
由於靜態鏈接會直接將庫編譯進程序里所以靜態編譯後的程序相較於動態鏈接所要大
這就是因為靜態鏈接會將鏈接庫編譯進程序里的原因,所以佔用就要大了
出於這種原因,靜態庫不易於維護與更新,如果鏈接庫中有實現有bug等需要更新則需要更新整個程序,因為靜態庫被編譯進程序中了
但動態庫就沒有這種情況了,因為動態庫是程序運行時動態載入的,所以我們只需要更新動態庫而不需要更新所有依賴該庫的程序(軟體)
另一方面,很多程序的開發都會使用到相同的鏈接庫,也就是很多程序(軟體)會有相同的依賴
如果將這些依賴全部靜態編譯的話將會造成存儲資源佔用過多而造成資源浪費
而使用動態庫的方式這些程序(軟體)則可以共享一個鏈接庫,而不需要每個程序都帶一個鏈接庫,這樣就大大地減少了存儲資源佔用空間
4. 在連接動態庫生成編譯可執行文件的時候,用g++編譯通過,用gcc報錯
Device_Init Query_UsrSum 這兩個函數在哪個文件里?
庫函數?
如果不是庫函數而且不在main.c中的話,需要在編譯的時候加上這兩個函數所在的文件。
5. VS2010的MFC程序如何調用動態庫文件(dll文件)放在system32中仍然編譯無法打開d
dll這個東西,只要放到編譯時會去訪問的任意路徑上即可。
比如你現在是Debug,你可以放到Debug文件夾或者工程文件夾;
你現在是Release, 你可以放到Release文件夾或者工程文件放到System32無法訪問可能說明你的程序根本不需要去訪問System32,雖然這不太可能。
當然我可以認為樓主是在隱式調用dll, 顯示調用失敗系統不會報錯。如果 你是要隱式調用已經知道庫在何處和其中函數定義的dll,可以在你的FingerMatch.cpp開始的時候寫上:
#ifdef _DEBUG
#pragma comment(lib, "..(路徑)fp.lib")
#else
#pragma comment(lib, "..(路徑)fp.lib")
#endif
然後包含一下fp.h,這個應該是已經做了。那應該不會有什麼問題了。
值得注意的是編譯時dll只會打開一次,比如你在Debug文件夾下有一個fp.dll,在工程文件夾下也有一個fp.dll,那麼編譯時使用的是Debug文件夾下的dll,因為它先被找到。
如果上面說的都沒用,那麼你顯式調用吧
6. FORTRAN中編譯動態庫的問題出現的錯誤
看樣子,似乎是重復載入了msvcrt.lib,需要仔細檢查
7. 當java調用c語言編寫的so動態庫時,缺少參數時為什麼還能調用且不提示錯誤
那你在C 中這個sub方法裡面,把第二個參數打出來看看,是不是空
8. 關於linux下連接動態庫問題
gcc編譯時,當使用動態庫編譯可以按照幾種寫法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的編譯參數都是按照2或3去寫
2寫法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫,即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進行鏈接,當然如果沒有動態庫就會去找靜態庫,再沒有應該就會在編譯時報錯
3寫法的含義是從-L參數首先從指定的目錄中尋找需要鏈接的庫文件,隨後再去尋找系統文件夾中是否存在需要的庫
1寫法的含義是將當前目錄下的./libSDL2-2.so.0文件鏈接進最終文件,因此執行readelf -a a.out後在動態庫部分所看到的路徑就是./libSDL2-2.so.0,進而在執行文件時僅會從當前目錄下尋找libSDL2-2.so.0文件,當執行文件時所在的目錄下沒有該文件時就會出現找不到庫文件的操作
你第二次操作時,因為function.so庫文件與a.out文件在同一個目錄,同時也是在該目錄下執行的ldd操作及運行a.out,a.out在載入動態庫時從當前目錄下找到了所需要的庫文件,此時能夠執行成功(ldd命令實質是一個腳本,通過設置環境變數運行動態庫鏈接器來輸出所有待鏈接的動態庫)。
你可以試試將a.out拷貝至其他目錄再次運行,將出現和第一次操作時一樣的現象,找不到function.so文件。
具體的解決方法就是修改編譯參數,將./libSDL2-2.so.0修改為-lSDL2-2並將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,並且可能因為沒有修改鏈接器的緩存文件(將可能找不到帶版本號後綴的動態庫),需要在/usr/lib目錄下建立一個文件連接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名稱為libSDL2-2.so