1. 如何在windows環境下將.so編譯成.dll如果不行,在linux下的具體編譯過程是怎樣的望高手回答。。謝!
.so文件就已經是經過編譯的C程序
而.dll文件是編譯好的動態鏈接庫文件,需要用rundll32.exe來執行,或者載入shell執行。
所以.so和.dll不能互換。
在linux下面直接用gcc編譯器就能編譯。
命令格式:
gcc 文件名 C源碼文件名
例:
gcc 123.so 123.c
===========================================
.dll的就是已經編譯成功的了,不能再被編譯。
就像生孩子,已經是女孩了,你還能捅回去再換
個男孩出來?
===========================================
2. 如何在Linux下來調用用dll庫
微軟表示:我們的編譯器並沒有考慮生成的機器碼還要能夠讓linux運行……
開個玩笑,這個問題你得先了解編譯原理,windows下的庫有兩種,一種是native code,這種就別想了,它之所以能夠在windows上運行,當然是因為編譯器把它們編譯成了windows操作系統能夠識別的機器碼組織形式(嚴謹地來說,是鏈接器和載入器的不同,以及各自的系統調用壓根就沒有互映射性,導致了linux不能使用它們);第二種是.net平台編譯出來的類庫,這個是生成了中間語言(IL),跟java一樣,原則上是跨平台的,不過很多年以來,它只是原則上而已,從來就沒跨過。不過現在的好消息是,.net standard已經在包括linux之內的若干操作系統上完成了實現,所以如果你在.net平台上編寫一個完全符合.net standard庫的dll的話,它是可以跑在linux上的(嚴格來說,是某些非常新的linux發行版),這就是大名鼎鼎的.net core,也是微軟目前在軟體開發方向上大力投入的開源社區項目。所以總的來說,微軟還是充分考慮到你的這種應用需求的。如果你確實想完成把windows下的應用程序改到linux下面來運行,.net core是目前最好的選擇(因為還有個叫Mono的哥們也在做同樣的事兒,你同樣可以參考)
3. 在linux下怎麼去調用dll文件
用交叉編譯環境是可以的。
如mingw。
建議在Windows下安裝mingw,然後調試。直接調用是肯定不行的。
參考我的博客:http://jeremiah.blog.51cto.com/539865/183560
有個 mono你可以試試,或者是利用wine來讀取,不過不管怎麼樣都不能直接讀取,但是間接的是可以的。大概的就這兩種方法,你可以去wine和mono的網站看看。
應該有不少這方面的資料的
4. 如何在Linux下反編譯dll文件
linux反編譯dll?
dll文件只用在win下吧。linux用.so文件。
更何況DLL的很多文件庫使用的win的函數或頭文件。
反編譯都不會很好處理,無論是win還是linux。
5. LinuxC++如何編寫線程安全庫
LinuxC++編寫線程安全庫dll的方法:
1、動態庫只有一個導出函數。
這種情況下編寫函數時,只需要考慮不要有沖突的全局數據就可以了。這里的全局數據包括了在堆中分配的數據塊和靜態全局變數等。如果存在這樣的全局數據,那麼進程中的不同線程訪問這個函數就會造成沖突。
2、動態庫導出了多個函數,而且多個函數間存在數據傳遞。
一般DLL都導出多個函數,一個初始化,一個資源釋放,其他為核心功能函數。這些函數間極有可能發生數據傳遞。如果一個初始化函數是在線程A中調用的,而核心功能函數是在線程B中調用的,那麼線程A初始化函數的資源就無法對應線程B中的核心功能,此外還有核心功能函數間的數據傳遞,這樣的DLL就不是線程安全的,必然導致錯誤。
解決辦法是由用戶(即使用DLL的人)保證這些導出函數是在一個線程中調用。但這樣會很大程度上限制介面的設計和用戶的使用自由度。所以最好的方法是函數只管自己的線程安全,不同函數傳遞數據用動態TLS,線程局部存儲。
3、限制訪問DLL中某一函數的線程數目。
對於DLL中的某一個函數的訪問線程數目是有限制的,超過了限制其他線程就得等一定的時間,一定的時間過後如果還不能得到執行機會,那就返回超時。這樣的設計對用戶來說是友好的,而且很實用,有的商業程序確實是按照允許用戶訪問的通道數目來計價的。
對DLL中的函數做這樣的一個封裝,一般是簡單的待用Semaphore信號量,來解決。DLL初始化時調用CreateSemaphore函數對信號量進行初始化,其原型如下:
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
// pointer to security attributes
LONG lInitialCount, // initial count
LONG lMaximumCount, // maximum count
LPCTSTR lpName // pointer to semaphore-object name
);
對於信號量,它每WaitForSingleObject一次(當然是要進入),其狀態值(一個整數)就減1,使用完ReleaseSemaphore其狀態值就加1,當其狀態值為0時信號量就由有信號變為無信號。利用信號量的這一特性,我們在初始化時將信號量的初始值(第2個參數)設置為限制的線程訪問數目。在要限制訪問線程數目的函數內部,通過調用WaitForSingleOject獲取控制權,並指定一個等待時間(這個由配置文件指定),根據情況超時返回,使用完ReleaseSemaphore釋放對佔用,讓其他線程可以調用這個函數。
4、多進程情況下的多線程安全DLL。
LL是可以被多個進行載入並調用的。那就是說如果我們只對一個進程進行了限制,那麼在多進程調用的情況下,這樣的限制被輕易攻破。
我們都知道,Semaphore信號量屬於內核對象,也就是說其可以被多進程共享訪問,也就說,如果我們給一個Semaphore指定了一個名字,在另一個進程中,我們只要調用OpenSemaphore函數用同一名字打開信號量就可以訪問了。這樣問題就解決了?
現實情況是,多進程情況下,一般不是簡單的多進程共享一個Semaphore就可以了。多進程間需要互通很多信息。一般的解決辦法是,採用共享數據段。
#pragma data_seg("share")
int share_data;
#pragma data_seg()
#pragma comment(linker,"/SECTION:share, RWS")
通過pragam編譯器指令生成了一個名叫share的共享數據段,這樣對於變數share_data就可以多進程共享的了。如果要多進程間交換數據,只要在data_seg中添加數據定義即可。
6. linux中把.c的文件編譯成.so
就跟用VS編譯dll或者lib文件差不多,把代碼編譯完成以後,命名為相應的後綴就好了。
例如:
gcc
-c
-fPIC
libst.c
生成
libst.o
然後
gcc
-shared
-fPIC
-o
libst.so
libst.o
生成
libst.so
動態鏈接庫
把libst.so拷貝到系統默認庫目錄下,比如
/lib,
/usr/lib
下
假定有
test.c
要引用這個庫
gcc
-lst
-o
test
test.c
然後就可以了
假如不能把libst.so拷貝到默認庫目錄下,比方說放在了
/home/aaa/lib
下
那麼就用這樣的語句來編譯test.c
gcc
-L/home/aaa/lib
-lst
-Wl,-rpath=/home/aaa/lib
-o
test
test.c
7. wine是怎麼實現在linux下調用win32裡面的dll文件的
使用wine可以達到您要的效果,但不是100%成功,個別的軟體會報dll錯誤。 以下是詳細使用方法: 在安裝前請確保你的系統中裝有 gcc 3.x (推薦使用 3.2.x ),很多讀者反映在 gcc 2.9.x 上編譯存在問題。 wine 的安裝配置 wine 的最新版本是 2003.wine是怎麼實現在linux下調用win32裡面的dll文件的
8. linuxvscode生成dll文件
1、首先在linux中新建文件夾,vscode打開。
2、其次vscode中使用快捷鍵ctrl+shift+p打開搜索欄,輸出cmake,選擇cmake:quickstart。
3、然後隨便輸入一個名字。
4、然後選擇生成可執行文件還是鏈接庫、
5、然後什麼報錯都不要管,直接點擊vscode底部欄中的build選項,此時打開build文件夾,你要的文件已經出現。
6、最後對於dll可執行文件,還可以直接點擊底部欄的三角形(run),直接運行。
9. JAVA中用JNI調用了在WIN32下編譯的DLL,如果在LINUX下執行這個JAVA程序,是否還可以繼續調用的DLL。
直接是不行的! linux裡面沒有dll。
不過看你的需求應該是java調用了其他程序別寫的功能,在linux裡面肯定可以!Linux也有動態鏈接庫的概念,不過叫Share Object ,你編譯一個.so的文件,然後還是使用JNI調用。
參考:
編譯so:http://www.cnblogs.com/ardar/articles/357321.html
java調用:http://..com/question/488673981.html
10. PHP在linux下怎麼調用.dll文件有關問題
哈?????
頭一次聽說 windows編譯的dll能在linux下載入
也沒准 據說新版C#可以跨平台 在 烏班圖的圖形界面編譯程序
如果你是想自定義擴展庫的話 需要在編譯時候 加入編譯參數
比如加入 curl擴展(這個最常用吧)
--with-curl[=DIR]
[]是你的擴展庫的路徑