PostgreSQL中怎么实现跨平台
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,今天就跟大家聊聊有关PostgreSQL中怎么实现跨平台,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。#include "dynloader.
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
互联网科技名片
互联网下的科技发展
科技信息互联网
易互联网科技有限公司
远信互联网科技
中国互联网有什么科技含量
字节跳动和互联网科技
科技与互联网哪个更好
佳云科技和互联网广告
和信科技工业互联网
新兴科技互联网创新大赛颁奖典礼
允成互联网科技有限公司融资
互联网科技股为什么大涨
图游互联网科技
容联科技互联网电商
互联网金融运营模式中的金融科技
福仕德教育科技互联网
三亚科技创新互联网基地
互联网科技快速发展优美句子
小牛互联网科技有限公司地址
科技互联网公司装修
奇酷互联网科技
上海致骋互联网科技
镁科技互联网资讯平台
互联网科技有哪些公司
青岛科技大学互联网大赛研究生
互联网与医疗科技
内蒙古九一互联网科技
互联网企业科技类企业如何做账
互联网科技平台产品运营