Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么特定函数的C名称(链接符号)前面应该加上';pg_finfo';?_C_Postgresql - Fatal编程技术网

为什么特定函数的C名称(链接符号)前面应该加上';pg_finfo';?

为什么特定函数的C名称(链接符号)前面应该加上';pg_finfo';?,c,postgresql,C,Postgresql,我有一个带有一个函数的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);

我有一个带有一个函数的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);
}
我收到错误“error:找不到函数“add\u one\u float8” 但使用“pg_finfo_add_one_float8”创建脚本成功结束

那么,在函数名前面加上“pg_finfo_”是正常的还是我做错了smth

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上构建扩展是一件痛苦的事情。我不确定是否真的有任何标准,推荐的方法来做到这一点

如果使用带有自定义makefile的
nmake
进行编译,则需要提供适当的编译器参数

以下是在我的Windows box上构建核心代码时使用的
cl
,使用带有
setenv/x86/release/xp
的Windows SDK 7.1,所有这些都在一行上:

C:\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\bin\CL.exe/C
/Isrc/include/Isrc/include/port/win32/Isrc/include/port/win32\msvc
/I“D:\libs\x86\Release\zlib-1.2.7\include”/Isrc\backend/Zi/nologo /W3/WX-/Ox/Oy-/D WIN32/D\u WINDOWS/D\u WINDOWS\u\u/D\u\u WIN32\u
/D EXEC_BACKEND/D WIN32_STACK_RLIMIT=4194304/D _CRT\u安全\u不推荐/D\u CRT\u非DC\u不推荐/D构建\u DLL/D\u使用\u 32位\u时间\u T/D\u MBCS/GF/Gm-/EHsc/MD/GS/fp:精确 /Zc:wchar_t/Zc:forScope/Gd/TC/wd4018/wd4244/wd4273/wd4102 /wd4090/wd4267/analyze-/errorReport:queue

Contrib模块可能会得到一些不同的选项;我还没有详细检查。关键是有很多编译器标志——主要是定义——在构建时传递

我通常在Windows上构建模块的方式是使用contrib/目录中的模块构建PostgreSQL源代码树的副本,使用常规的
build.pl
编译它。我相信有一种更明智的方法,我不需要花太多时间去寻找。

问题解决了

这段代码运行良好(源代码:)

您应该只使用上面问题中的makefile使用
nmake
编译此代码,并通过CREATE FUNCTION命令将函数添加到数据库中:

CREATE FUNCTION add_one(double precision) RETURNS double precision
AS 'DIRECTORY\mylib.dll', 'add_one_float8'
LANGUAGE C STRICT;

这是不正常的,肯定是出了问题。虽然create脚本可能已经成功运行,但如果调用该函数并没有导致后端崩溃,我会感到惊讶。你是如何编译这个DLL的?您在Windows上,因此不会像在sane平台上那样只使用PGX。此函数不会崩溃,但始终返回smth,如4.9e-324。。没错。我在控制台上用微软Visual C++编译器C.exe编译为C文件,并用Link .exe链接到DLLK,这样就手工编译了。您应该真正显示问题更新中使用的命令行。如果您缺少必要的预处理器定义,我不会太惊讶。在Windows上编译扩展是一件非常痛苦的事情。我通常通过将它们添加到contrib/中的PostgreSQL源代码树中,并让vcbuild.pl代码负责构建它们来实现。我不确定你是否可以在windows上使用PGX…这会起作用,但这是错误的做法。您不应该重新定义
PG#u MODULE_MAGIC
,等等,您应该设置适当的预处理器定义,以使
#包含的
正确运行。Craig,我尝试了您推荐的编译器参数,但不起作用。。我找不到关于它的任何其他信息,所有的例子都不适用于Windows。我不建议准确地传递这些参数。我向您展示了在编译Pg源代码时,会传递额外的标志。具体哪些标志取决于您的构建。我强烈建议您使用
build.pl
在contrib/中的PostgreSQL源代码树中构建扩展。我同意为Windows构建扩展的文档不足。
/* Use 32-bit timer (provided header file uses 64-bit timer, not
 * compatible with Windows postgreSQL versions */
#define _USE_32BIT_TIME_T

/* Ensure that Pg_module_function and friends are declared __declspec(dllexport) */
#ifndef BUILDING_MODULE
#define BUILDING_MODULE
#endif

#include "postgres.h"
#include "fmgr.h"

/*--------------- BEGIN REDEFINITION OF PG MACROS -------------------* 
 These rewritten versions of PG_MODULE_MAGIC and PG_FUNCTION_INFO_V1
 * declare the module functions as __declspec(dllexport) when building
 * a module. They also provide PGMODULEEXPORT for exporting functions
 * in user DLLs.
 */
#undef PG_MODULE_MAGIC
#undef PG_FUNCTION_INFO_V1

#define PGMODULEEXPORT __declspec (dllexport)

#define PG_MODULE_MAGIC \
PGMODULEEXPORT const Pg_magic_struct * \
PG_MAGIC_FUNCTION_NAME(void) \
{ \
    static const Pg_magic_struct Pg_magic_data = PG_MODULE_MAGIC_DATA; \
    return &Pg_magic_data; \
} \
extern int no_such_variable

#define PG_FUNCTION_INFO_V1(funcname) \
PGMODULEEXPORT const Pg_finfo_record *  \
CppConcat(pg_finfo_,funcname) (void) \
{ \
    static const Pg_finfo_record my_finfo = { 1 }; \
    return &my_finfo; \
} \
extern int no_such_variable

/*--------------- END REDEFINITION OF PG MACROS -------------------*/

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(add_one_float8);

PGMODULEEXPORT 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;