【问题标题】:Link against a 3rd-party library with Visual Studio使用 Visual Studio 链接到第 3 方库
【发布时间】:2014-09-01 19:33:07
【问题描述】:

我正在尝试使用 Visual Studios 2013 创建一个 .dll。该项目包含 libpq 功能。

根据我在 Internet 上找到的其他 stackoverflow 帖子和其他来源,我(据我所知)已将 postgres 库和包含目录正确添加到项目中。但是,当我去构建项目时,它会返回一些“未解析的外部符号”错误。

我的路径是C:\Program Files\PostresSQL\9.3\...,所以我在“附加库/包含目录”字段中将它们用引号括起来。我在项目中包含了libpq-fe.h 头文件......我只是不确定我做错了什么。

另一个注意事项,我可以使用带有 -I、-L 和 -lpq 标志的 g++ 从命令行编译测试程序,但我不确定如何从命令行编译为 .dll(加上它增加了我不想处理的复杂性)。

这些是我得到的具体错误:

1>sql_arma.obj : error LNK2001: unresolved external symbol _PQconnectdb
1>sql_arma.obj : error LNK2001: unresolved external symbol _PQstatus
1>sql_arma.obj : error LNK2001: unresolved external symbol _PQerrorMessage
1>sql_arma.obj : error LNK2001: unresolved external symbol _PQfinish
1>C:\Users\tills13\documents\visual studio 2013\Projects\sql_arma\Release\sql_arma.dll : fatal error LNK1120: 4 unresolved externals

如下所示,我在项目的源文件中包含了#pragma comment(lib, "libpq.lib"),但我仍然收到这些错误。

【问题讨论】:

  • 为了构建一个依赖于来自另一个 DLL 的符号的 DLL,我认为您应该导出这些符号。也许这可以帮助你更多:[1] msdn.microsoft.com/en-us/library/z4zxe9k8.aspx [2] stackoverflow.com/questions/225432/… [3] msdn.microsoft.com/en-us/library/a90k134d.aspx
  • 我正在导出代码中需要的符号。我的问题是来自 libpq 的未定义符号。
  • @hbobenicio 就像我在帖子中所说的那样,我可以使用命令行将其编译为可执行文件,该可执行文件使用相同的库并包含目录即可正常工作
  • 您检查过 32/64 位和/或runtime type 吗?
  • @TylerSebastian 你能发布确切的链接器错误吗?这可能有助于我们清楚地理解问题。只是在黑暗中拍摄,您是否链接到正确的运行时?

标签: c++ visual-studio dll libpq


【解决方案1】:

我已经通过设置这些项目属性成功编译了sample program

  • <pgsql install path>\include\lib添加到VC++目录->包含->库,相应地
  • libpq.lib 添加到链接器->输入->附加依赖项

这是引用 3rd-party 库的标准方式。只是他们建议为他们的“基本目录”使用环境变量,以避免在项目位于 VCS 下时对其进行修补。

  • 为了能够从 VS 运行应用程序(包括调试和不调试),我还在 Debugging->Environment 中指定了 PATH=%PATH%;<pgsql install path>\bin,因为这个目录不在我的 PATH 中系统。

【讨论】:

  • 谢谢。将libpq.lib 添加到附加依赖项就可以了。我希望我能给你赏金。
  • @ivan_pozdeev:我在 VC++ 目录中添加了 include 和 lib 目录的 pgsql 路径。还添加了 libpq.lib 作为附加依赖项,我仍然看到将问题链接为未解决的符号。代码编译成功但出现链接错误。
  • @void 没有看到更多信息就无法判断。提出另一个问题,提及您在此问题中所做的指定并提供相关设置和输出。
  • @ivan_pozdeev:我可以解决链接问题。当我用 32 位替换 64 位版本时,我使用 64 位 postgres 安装程序,因为我有 64 位操作系统。我能够成功运行示例代码。我不确定为什么它会给我 64 位安装程序的链接错误。
【解决方案2】:

将postgres lib目录添加到项目中是不够的,还必须添加 参考libpq.lib。只需将此行添加到您的源 .cpp 文件之一:

#pragma comment(lib, "libpq.lib")

正如 Marco A. 所述,该库必须匹配程序位数(32 位或 64 位):如果您构建 32 位 DLL(称为 Win32),则必须使用 32 位库; if 64 位 (x64) - 64 位库。

【讨论】:

  • 不幸的是,它仍然无法正常工作。我已经用更多信息编辑了我的帖子。
  • 我目前正在重新安装 32 位 postgres,看看是否能解决问题。
  • 不行。 32 位和 64 位 postgres 产生相同的错误。
【解决方案3】:

我也遇到过同样的问题。然后我意识到我正在将我的应用程序构建为 32 位。我将应用程序的目标更改为 x64 并成功编译

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2021-10-29
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多