https://www.cnblogs.com/shijingjing07/p/5606930.html
http://pnxio.iteye.com/blog/2204451
https://bbs.pediy.com/thread-99734.htm
1.什么是DLL
缺点:易发生版本冲突
当新版本的动态链接库不兼容旧版本时,其他使用该DLL的程序可能无法正常工作。
针对这一问题,我们需要在程序中加上一个manifest文件,指明该程序所使用的DLL版本号。
1)在MinGW 中,用gcc编译,使用如下声明可以使变量a保存在共享section中,可以在多进程间共享数据,亲自测试过,可以行,倒是同样代码在linux gcc编译高级不是别,无法生效。 (百度了好久才查到#pragma comment(linker,"/SECTION:s_data,RWS") 这种VC中的设置在gcc中不生效,可以通过objdump -h 查看section是否生成)
2)VC中可以通过如下方式,使guiCurrentPage 成为共享数据(未实际测试过), 但是在MinGW的gcc中无效
#pragma data_seg("s_data") // 声明共享数据段,并命名该数据段
unsigned int guiCurrentPage = 255;
#pragma data_seg()
#pragma comment(linker,"/SECTION:s_data,RWS")
3)Linux 共享库(动态库)与进程之间全局变量是无法共享的
如果想在进程间依靠动态库来共享全局变量恐怕是不太可能的事情,因为不同进程访问动态库时,是写时拷贝,即如果另外一个进程试图去修改动态库中的全局变量时,系统就会把这个全局变量拷贝一份单独给这个进程,而这个修改操作并不会影响到其他进程中变量的值。
http://pnxio.iteye.com/blog/2204451
https://bbs.pediy.com/thread-99734.htm
1.什么是DLL
DLL,即动态链接库,是包含若干个函数的库文件,可供其他程序运行时调用。
2.DLL的优缺点
优点:代码重用,可供多个程序同时调用缺点:易发生版本冲突
当新版本的动态链接库不兼容旧版本时,其他使用该DLL的程序可能无法正常工作。
针对这一问题,我们需要在程序中加上一个manifest文件,指明该程序所使用的DLL版本号。
此时,程序将根据manifest加载指定版本的DLL,否则按默认版本加载。
3.DLL数据共享1)在MinGW 中,用gcc编译,使用如下声明可以使变量a保存在共享section中,可以在多进程间共享数据,亲自测试过,可以行,倒是同样代码在linux gcc编译高级不是别,无法生效。 (百度了好久才查到#pragma comment(linker,"/SECTION:s_data,RWS") 这种VC中的设置在gcc中不生效,可以通过objdump -h 查看section是否生成)
int __attribute__((section ("SHARED"), shared)) a= 0;
1.mydll.h
__declspec(dllexport) int add(int a, int b);
2.mydll.c
#include "mydll.h"
int __attribute__((section ("SHARED"), shared)) a1= 0;
//#pragma data_seg("s_data") // 声明共享数据段,并命名该数据段
// volatile unsigned int guiCurrentPage = 255;
//#pragma data_seg()
//#pragma comment(linker,"/SECTION:s_data,RWS")
int add(int a, int b) //该DLL需要导出的函数功能:加法
{
a1++;
return a + b + a1;
}
编译命令:gcc -shared -o MyDll.dll mydll.c
3. t1.c
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
void main(void)
{
typedef int(*padd)(int a,int b);
HINSTANCE hDLL;
padd add;
hDLL=LoadLibrary("MyDll.dll");
add=(padd)GetProcAddress(hDLL,"add");
int result=add(5,8);
printf("result %d\n",result);
while(1)
{
;
}
FreeLibrary(hDLL);
}
gcc -o t1.exe t1.c -dll
2)VC中可以通过如下方式,使guiCurrentPage 成为共享数据(未实际测试过), 但是在MinGW的gcc中无效
#pragma data_seg("s_data") // 声明共享数据段,并命名该数据段
unsigned int guiCurrentPage = 255;
#pragma data_seg()
#pragma comment(linker,"/SECTION:s_data,RWS")
3)Linux 共享库(动态库)与进程之间全局变量是无法共享的
如果想在进程间依靠动态库来共享全局变量恐怕是不太可能的事情,因为不同进程访问动态库时,是写时拷贝,即如果另外一个进程试图去修改动态库中的全局变量时,系统就会把这个全局变量拷贝一份单独给这个进程,而这个修改操作并不会影响到其他进程中变量的值。
4)但是可以用socket通讯进行进程间共享,比如universalsocket.so中有个socket_server.c和socket_client.c, 另一个进程通过调用动态的的方法 read_memory(int socket_pfd,u_int32 address,char*data) (前面先调用共享库中的方法,建立socket链接,通过socket句柄通讯)