使用 Microsoft Visual Studio 在 Windows 64 位上为 PostgreSQL 数据库创建 C 函数 dll

标签 c visual-studio postgresql dll

我正在尝试根据此处给出的说明创建我的第一个 dll:https://en.scribd.com/doc/40725510/Build-PostgreSQL-C-Functions-on-Windows 功能简单,在其他电脑上运行。

#include "postgres.h"
#include "fmgr.h"
#include <windows.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

#if defined(_WIN32)
#define DLLEXPORT __declspec(dllexport) 
#else
#define DLLEXPORT
#endif

#define WIN32_LEAN_AND_MEAN
#define NOCOMM

PG_FUNCTION_INFO_V1(fibbonachi);
DLLEXPORT Datum
fibbonachi(PG_FUNCTION_ARGS)
{
    int32 arg = PG_GETARG_INT32(0);
    if (arg > 0 && arg < 100)
    {
        if (arg == 1 || arg == 2)
            PG_RETURN_INT32(1);
        else
        {
            int arr[100];
            arr[0] = 1;
            arr[1] = 1;
            for (int i = 2; i < arg; i++)
                arr[i] = arr[i - 1] + arr[i - 2];
            PG_RETURN_INT32(arr[arg - 1]);
        }
    }
    else
        PG_RETURN_INT32(0);
}

只要我在 Configuration Manager 中使用 Win32 作为 Active Solution Platform,构建就会成功。但是,当我尝试通过以下代码在 pgAdmin 中创建函数时:

CREATE or REPLACE FUNCTION fibbonachi(integer) RETURNS integer 
AS E'D:\\Homework\\Databases\\PostgreSQL_dll\\Debug\\PostgreSQL_dll.dll', 'fibbonachi'
LANGUAGE C STRICT;

我收到错误消息“%1 不是有效的 Win32 应用程序”。这是预料之中的,因为我使用 64 位版本的 PostgreSQL。但是,如果我将解决方案平台切换到 x64(如果我没记错的话,这是纠正错误所必需的),尝试构建 progect 会导致文件 MSVCRTD.lib 中出现 32 个“未解析的外部符号”错误。我在这里找到了关于类似问题的讨论:https://social.msdn.microsoft.com/Forums/vstudio/en-US/c1553a42-7d1e-4c74-9156-95768a72e4df/unresolved-externals-after-upgrading-from-vs2008-to-vs2010?forum=vcgeneral 错误似乎是由来自不同版本的 Visual Studio 的库冲突引起的,但重新安装没有帮助,我不知道如何手动更正路径(我仍然不完全确定我的问题是否相同)。我使用的路径与指令中的相同,但他们使用的是 64 位版本的 PostgreSQL:

C:\Program Files\Microsoft SDKs\Windows\v7.0\Include
C:\Program Files\PostgreSQL\9.3\include\server\port\win32
C:\Program Files\PostgreSQL\9.3\include\server\port
C:\Program Files\PostgreSQL\9.3\include\server
C:\Program Files\PostgreSQL\9.3\include\internal
+directory of dummy header libintl.h

关于如何成功构建 x64 progect 的任何想法?

最佳答案

嗯,我的同学检查了我的设置,似乎来自包含路径的 Microsoft SDKs 文件夹出于某种奇怪的原因导致了这些错误,尽管事实上指令表明它们是必要的。不过他不记得他究竟是从哪里找到这些信息的。 尽管如此,问题还是解决了。该项目在没有 Microsoft SDKs 文件夹路径的情况下成功构建,并且使用生成的 dll 成功地在数据库中创建函数。 如果有人知道图书馆发生这种冲突的原因,我仍然很想知道。

关于使用 Microsoft Visual Studio 在 Windows 64 位上为 PostgreSQL 数据库创建 C 函数 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27820964/

相关文章:

c - 显示按状态过滤的进程的系统调用

C - 构建/编译/部署成功但在其他机器上失败

visual-studio - Visual Studio - 如何在不接触鼠标的情况下使用它?

java - 错误 : column "id" is of type uuid but expression is of type bytea

c printf函数动态类型确定

c++ - 实时查看循环缓冲区中的数据

c - 指向函数指针的指针 - 表达式必须是可修改的左值

c# - 如何在我的应用程序中集成 Visual Studio

java - 如何将一个 Set 插入到 integer[] 类型的列中?

sql - PostgreSQL - 基于列数据的减法简化查询