- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个函数的 DLL
#include "postgres.h"
#include <string.h>
#include "fmgr.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
PG_FUNCTION_INFO_V1(add_one_float8);
Datum
add_one_float8(PG_FUNCTION_ARGS)
{
float8 arg = PG_GETARG_FLOAT8(0);
PG_RETURN_FLOAT8(arg + 1.0);
}
当我尝试创建函数时:
CREATE FUNCTION add_one(double precision) RETURNS double precision
AS 'DIRECTORY\mylib.dll', 'add_one_float8'
LANGUAGE C STRICT;
我收到错误“错误:找不到函数“add_one_float8””但是使用“pg_finfo_add_one_float8”创建脚本成功结束。
那么在函数名前面加上“pg_finfo_”是正常的还是我做错了?
PostgreSQL 版本 9.1
谢谢。
更新:
生成文件
PG_DIR=D:/Programs/PostgreSQL
PG_LIB=$(PG_DIR)/lib/postgres.lib
PG_INCLUDE_SERVER=$(PG_DIR)/include/server
PG_INCLUDE=$(PG_DIR)/include
PG_INCLUDE_PORT_WIN32=$(PG_DIR)/include/server/port/win32
PG_INCLUDE_PORT_WIN32_MSVC=$(PG_DIR)/include/server/port/win32_msvc
MSDK_INCLUDE="D:\Program Files\Microsoft SDKs\Windows\v7.0\Include"
COMPILER_INCLUDES=/I$(PG_INCLUDE) /I$(PG_INCLUDE_SERVER) /I $(PG_INCLUDE_PORT_WIN32) /I$(PG_INCLUDE_PORT_WIN32_MSVC) /I$(MSDK_INCLUDE)
LINKER_DLL_FLAGS=/MACHINE:X86
COMPILER_DLL_FLAGS=/c /TC /D "WIN32"
DLL_NAME=mylib
DLL_DEST=D:\lib
OBJS=myfunc.obj
.c.obj:
cl $(COMPILER_DLL_FLAGS) $(COMPILER_INCLUDES) $*.c
all:$(OBJS)
link -out:$(DLL_DEST)\$(DLL_NAME).dll /DLL $(OBJS) $(PG_LIB)
最佳答案
在 Windows 上构建扩展是一件痛苦的事情。我不确定是否真的有任何标准的推荐方法。
如果您使用 nmake
进行编译对于自定义 makefile,您需要提供适当的编译器参数。
这是cl
在我的 Windows 机器上构建核心代码时被调用,使用 Windows SDK 7.1 和 setenv /x86 /release /xp
, 全部在一行中:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c
/Isrc/include /Isrc/include/port/win32 /Isrc/include/port/win32_msvc<br/>
/I"D:\libs\x86\Release\zlib-1.2.7\include" /Isrc\backend /Zi /nologo
/W3 /WX- /Ox /Oy- /D WIN32 /D _WINDOWS /D __WINDOWS__ /D __WIN32__<br/>
/D EXEC_BACKEND /D WIN32_STACK_RLIMIT=4194304 /D
_CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D BUILDING_DLL /D _USE_32BIT_TIME_T /D _MBCS /GF /Gm- /EHsc /MD /GS /fp:precise
/Zc:wchar_t /Zc:forScope /Gd /TC /wd4018 /wd4244 /wd4273 /wd4102
/wd4090 /wd4267 /analyze- /errorReport:queue
Contrib 模块可能会有一些不同的选项;我没有详细查过。关键是有很多编译器标志 - 主要是定义 - 在构建时传递。
我通常在 Windows 上构建模块的方式是在 contrib/目录中使用我的模块构建 PostgreSQL 源代码树的副本,使用常规 build.pl
编译它。我确信有更明智的方法,我不需要做得足够多,也不必费心去寻找。
关于c - 为什么特定函数的 C 名称(链接符号)应以 'pg_finfo_' 为前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13776232/
我是一名优秀的程序员,十分优秀!