如何在Windows 10上正确安装SOCI C ++库?

时间:2019-05-11 20:46:41

标签: c++ database soci

我想用c ++进行数据库编码。 What modern C++ libraries should be in my toolbox?表明SOCI是一个很好的跨平台,免费的库。但是SOCI的安装是一个大问题,因为我找不到很好的博客,教程或文章,也没有提供任何详细的摘要。我按照SOCI官方页面http://soci.sourceforge.net/doc/3.2/installation.html上的说明进行操作,但是成功之后(因为它无法检测到增强,所以我不得不运行它),在我在Visual Studio中构建.sln时,它运行了cmake。给我4个错误。我已经尝试了好几天,但似乎没有任何效果。 yt https://www.youtube.com/watch?v=gFGLKaDnwmI上只有一个视频,但是它显示了一种方法,您必须操作lib文件中的micros。我不想那样做。而且由于我认为这是一个享誉盛名的流行音乐库,因此我不必这么做。无论如何,构建o / p太大,所以我发布了我得到的错误。第一个出现3次。所以,这就是为什么我认为我得到4个失败的最终结果。

5>C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\ucrt\stdio.h(1935): fatal error C1189: #error:  Macro definition of snprintf conflicts with Standard Library function declaration

8>LINK : fatal error LNK1104: cannot open file '..\..\..\lib\Debug\libsoci_postgresql_3_2.lib'


========== Build: 8 succeeded, 4 failed, 0 up-to-date, 3 skipped ==========

我还有一个不重要的问题,只是一个麻烦而已(不要为这个举报我。如果愿意,我将其删除)。数据库编程不是经常用c ++完成吗?还是C ++程序员比C ++更喜欢C api? Cos,我很难在同一篇文章上找到近期的好文章或博客。

2 个答案:

答案 0 :(得分:0)

您要构建什么版本的soci?我发现thread与您的错误:

  

构建失败,因为有两个包含的文件重新定义了'snprintf'符号。第一个定义在“ D:\ devsrc \ soci-3.2.3 \ core \ soci-platform.h”中,第二个定义(产生错误)在“ C:\ Program Files(x86)\ Windows Kits \ 10 \ include \ 10.0.10150.0 \ ucrt \ stdio.h”(标准库文件)。

     

要解决该错误,请注释“ D:\ devsrc \ soci-3.2.3 \ core \ soci-platform.h”的第27行:

     

// #define snprintf _snprintf

     

,因此SOCI会忽略其自身的定义,而使用标准库的定义。

但是图书馆的作者说:

  

记录下来,我刚刚设法用VS2015构建SOCI 3.2.3   (CL.EXE版本19.00.24215.1),而无需进行任何问题或修改。

     

git clone https://github.com/SOCI/soci.git git co release/3.2 mkdir _build cd _build cmake ..

     

然后使用VS2015加载SOCI.sln并进行构建。

您还可以尝试构建master分支(又称为 4.0.0 版本)。

答案 1 :(得分:0)

显然,此问题不仅与SOCI有关。在寻找解决方案时,我遇到了许多其他库,它们在VS17中也存在相同的问题。 https://github.com/robotology/icub-firmware-shared/issues/25 https://forum.juce.com/t/solved-error-with-vs2015-regarding-snprintf/14831来链接一些。 好像在某些版本之后,“ snprintf”已添加到VS(标准库)中。因此,它与使用它的所有库的宏都冲突。

解决该问题的唯一方法是如下手动更改宏的名称(如视频中所示)或编辑宏定义(我做了,更喜欢使用cos使其更清晰)。 :

#define snprintf _snprintf

至:

#if _MSC_VER < 1900
#define snprintf _snprintf
#endif

这消除了我的所有错误,并且解决方案构建成功,没有任何错误。 我不知道为什么维护人员没有对库本身进行更改以避免这种情况。我希望与他们保持联系,并要求他们也这样做。

希望这对任何在图书馆遇到类似问题的人有所帮助。