我正在尝试根据此处给出的说明创建我的第一个 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/