【问题标题】:Why isn't this library linking with a pragma comment?为什么这个库没有与 pragma 注释链接?
【发布时间】:2010-10-08 01:15:43
【问题描述】:

我正在使用 Visual C++ 2008 进行的项目中使用 Fmod。如果我包含

../fmodapi375win/api/lib/fmodvc.lib

在项目->链接器->输入中,它工作正常,但出于某种原因,如果我使用

#pragma comment(lib,"../fmodapi375win/api/lib/fmodvc.lib")

相反,它的工作方式与该行不存在时相同:它构建时没有链接器错误,然后因一百万个访问冲突异常而导致堆栈溢出而崩溃。

发生了什么,我该如何解决它以便我可以在代码中定义库?

【问题讨论】:

    标签: visual-c++ linker pragma


    【解决方案1】:

    我认为您不应该在编译指示注释中提供 .lib,但是,我认为真正的问题是您通过路径调用注释。将路径添加到您的 lib 搜索路径,然后只需使用

    #pragma comment(lib,"fmodvc")
    

    您应该能够在此评论中使用路径,但您确定您使用的 ..\ 路径在链接期间是正确的路径吗?还要确保你没有使用 /nodefaultlib 编译...

    如果这仍然不起作用,请告诉我。我经常使用这种类型的 pragma,并取得了巨大的成功......

    但是,现在我几乎被困在 C# 世界中,我什至没有太多时间在 C++ 中编程......

    【讨论】:

    • Stuart,自从这篇文章之后我已经回去了,我已经使用了你正在使用的#pragma,它确实有效。您只需要确保您实际上是从正确的目录链接。我的猜测是 ../ 不正确,因为链接器在 $(TargetDir) 目录之外工作......希望这会有所帮助。如果它仍然不起作用,请告诉我,我会进一步深入研究......
    • +1 用于观察 /nodefaultlib。让我措手不及的是,这会使 '#pragma comment(lib, ...)' 无法正常工作。
    【解决方案2】:

    库可以以其他顺序链接,因此符号的解析方式不同。

    【讨论】:

      【解决方案3】:

      你确定这两个实例是同一个 lib 文件吗?

      如果您错过了您的机器上有一个文件的两个版本这一事实,这可能会变得非常奇怪。我强烈建议您在驱动器中搜索所有出现此文件的位置,以便进行完整性检查。

      【讨论】:

        【解决方案4】:

        在链接的命令行上设置 /VERBOSE。在 GUI 中,您可以在项目的属性页上执行此操作——添加到链接器下的“命令行”节点。

        然后它会告诉你它是如何解析每个函数的——搜索你知道应该在 fmodvc.lib 中的函数。

        另一件事是在链接期间运行 PROCMON.EXE(预过滤,以便 PATH CONTAINS fmodvc.lib)——然后链接。它会告诉您找到文件的确切位置(以及是否曾经查找过)。在此处获取 PROCMON:http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

        最后,如果它正在链接,但没有加载您的库(或解析引用)——您可以选择强制链接成功设置——您应该关闭它。在命令行部分(如 /VERBOSE)中将是 /FORCE

        【讨论】:

        • 进程监视器会找到静态链接库吗?
        • 在链接期间,是的。在链接期间,链接器必须尝试打开文件——procmon 会看到。
        猜你喜欢
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 2019-09-05
        • 2015-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多