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]
[]是你的扩展库的路径