PostgreSQL中怎么实现跨平台
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,今天就跟大家聊聊有关PostgreSQL中怎么实现跨平台,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。#include "dynloader.
千家信息网最后更新 2025年12月01日PostgreSQL中怎么实现跨平台
今天就跟大家聊聊有关PostgreSQL中怎么实现跨平台,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
#include "dynloader.h"
mysql_dll_handle = dlopen(_MYSQL_LIBNAME, RTLD_LAZY | RTLD_DEEPBIND);改为mysql_dll_handle = dlopen(_MYSQL_LIBNAME, 1);
更正规的写法是
#if defined(__APPLE__) || defined(__FreeBSD__) mysql_dll_handle = dlopen(_MYSQL_LIBNAME, RTLD_LAZY);#elif defined WIN32 mysql_dll_handle = pg_dlopen(_MYSQL_LIBNAME, 1);#else mysql_dll_handle = dlopen(_MYSQL_LIBNAME, RTLD_LAZY | RTLD_DEEPBIND);#endif
这里并没有修改原有两行,只是为展示应该怎么写,模块代码的跨平台性才会更好些。
dynloader.h在编译前会根据平台指向正确的头文件,在Windows下指向 src/backend/port/dynloader/win32.h
#define pg_dlopen(f) dlopen((f), 1)#define pg_dlsym dlsym#define pg_dlclose dlclose#define pg_dlerror dlerrorchar *dlerror(void);int dlclose(void *handle);void *dlsym(void *handle, const char *symbol);void *dlopen(const char *path, int mode);
Windows下封装了库载入的系列函数,它们实现在 src/backend/port/dynloader/win32.c,节选:
void *dlopen(const char *path, int mode){ HMODULE h; int prevmode; /* Disable popup error messages when loading DLLs */ prevmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); h = LoadLibrary(path); SetErrorMode(prevmode); if (!h) { set_dl_error(); return NULL; } last_dyn_error[0] = 0; return (void *) h;}最终,仍然是调用传统的Windows函数LoadLibrary。
前文还提到修改Solution.pm,只为mysql_fdw添加库和头文件路径,避免影响其他模块。因为mysql有些头文件跟PG定义冲突,大家都是关系数据库,难免有些东西的命名会相同 @_@。
上边说的是编译系统自动识别当前平台,编译不同源文件,*nix平台是在configure脚本里。
平台判断:
case $host_os in aix*) template=aix ;; cygwin*) template=cygwin ;; darwin*) template=darwin ;;dragonfly*) template=netbsd ;; freebsd*) template=freebsd ;; hpux*) template=hpux ;; linux*|gnu*|k*bsd*-gnu) template=linux ;; mingw*) template=win32 ;; netbsd*) template=netbsd ;; openbsd*) template=openbsd ;; solaris*) template=solaris ;;esac
指定软链文件(比如macOS会指向 src/backend/port/dynloader/darwin.h)
"src/include/dynloader.h") CONFIG_LINKS="$CONFIG_LINKS src/include/dynloader.h:src/backend/port/dynloader/${template}.h" ;;再来看Windows(Solution.pm中),用的是拷贝方式:
if (IsNewer( 'src/include/dynloader.h', 'src/backend/port/dynloader/win32.h')) { copyFile('src/backend/port/dynloader/win32.h', 'src/include/dynloader.h'); }当然,代码里更多的是传统preprocessor方式:
#ifdef WIN32 /* Win32 does not have UTF-8, so we need to map to UTF-16 */ if (GetDatabaseEncoding() == PG_UTF8 && (!mylocale || mylocale->provider == COLLPROVIDER_LIBC)) {...#endif /* WIN32 */看完上述内容,你们对PostgreSQL中怎么实现跨平台有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
平台
文件
内容
指向
编译
代码
传统
函数
方式
更多
模块
不同
相同
上边
东西
写法
只是
拷贝
数据
数据库
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
遵化企业网络技术售后保障
wpf怎么跟数据库连接
5g手机网络安全概念
国内常用的数据库软件
小型企业对服务器的需求
中国网络安全电话
实验四数据库的安全性
软件开发环境必须包括
国家网络安全法确定以下原则
连不上内网数据库
ppt上传到服务器在下载打不开
跨国并购数据库
并行数据库与关系数据库
网页版数据库系统时间
清除本地连接数据库
武汉通铭软件开发有限公司
我国为保护网络安全的措施
软件开发公司找项目
领跑添加照片数据库
数据库如何复制表
校园网络安全日宣传片
网络安全细分领域排名全球第二
无线管理服务器作用
少干服务器
163收件服务器的主机名怎么填
散列数据库
重庆移动服务器托管销售云服务器
hfs分享服务器
哪些东西危害网络安全告
客户端显示服务器连接异常