在Visual Studio中链接PostgreSQL自定义C++项目时出错
Error linking PostgreSQL custom C++ project in Visual Studio
我在Notepad++中编写了一系列自定义的C PostgreSQL函数。我使用VS2015 x64 Native Tools命令行实用程序编译代码并将其链接。没有问题,工作非常完美。
但是,尽管用Notepad++编码很有趣,我还是决定在VisualStudio中创建一个项目。经过几个小时的正确配置,我可以编译项目,但不能链接。
具体错误为:
错误LNK2019未解析的外部符号"double__cdeclDatumGetFloat8(unsigned__int64)"(?DatumGETFoat8@@YAN_K@Z)在函数"unsigned __int64 __cdecl wrapf64(结构FunctionCallInfoData*)"(?wrapf64@@YA_KPEAUFunctionCallInfoData@@@Z)。。。错误LNK2019未解析的外部符号"unsigned __int64 __cdeclFloat8GetDatum(双)"(?Float8GetDatum@@YA_KN@Z)中引用函数"unsigned __int64 __cdecl wrapf64(struct FunctionCallInfoData*)"(?wrapf64@@YA_KPEAUFunctionCallInfoData@@@Z)…
症状出现在fmgr.h
(我的评论):
/* these macros hide the pass-by-reference-ness of the datatype: */
#define PG_GETARG_FLOAT4(n) DatumGetFloat4(PG_GETARG_DATUM(n)) // missing a definition
#define PG_GETARG_FLOAT8(n) DatumGetFloat8(PG_GETARG_DATUM(n)) // missing a definition
#define PG_GETARG_INT64(n) DatumGetInt64(PG_GETARG_DATUM(n))
在postgres.h
中,我们看到:
#ifdef USE_FLOAT8_BYVAL
extern float8 DatumGetFloat8(Datum X);
#else
#define DatumGetFloat8(X) (* ((float8 *) DatumGetPointer(X)))
#endif
没有#define
。添加一个并不能解决问题。
相比之下:
#ifdef USE_FLOAT8_BYVAL
#define DatumGetInt64(X) ((int64) GET_8_BYTES(X))
#else
#define DatumGetInt64(X) (* ((int64 *) DatumGetPointer(X)))
#endif
这是PostgreSQL未经编辑的源代码,它是从命令行实用程序中运行的。VS内部有什么问题?或者,我应该说,当#define
丢失时,为什么它在命令行链接器中工作?
有什么建议吗?
另一个问题是,我的原始代码有abs(double ...)
,但在VS中,我必须使用fabs(double ...)
。这是C与C++的比较点吗?我在MSDN中找不到明确的答案。
对于其他可能有类似问题的人,答案是确保源文件是C,而不是C++。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 如何维护资源管理器项目视图中当前可见的项目列表
- 错误-我无法在VS2019中打开新的Qt项目
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗