【问题标题】:How to bind static library in a dynamic one in Code::Blocks如何在 Code::Blocks 中将静态库绑定到动态库中
【发布时间】:2013-06-08 03:34:38
【问题描述】:

我有这个静态(.a/.lib) 库,我想将它绑定到我的动态(.dll) 中。 假设静态库是libColors.a,动态库是SWC.dll。 现在我已经更改了 libColors.a 项目属性以创建一个静态库——构建它——我还没有找到任何 .dll 创建,只有预期的 .o 和 .a 文件。我切换到我的SWC.dll 项目并更改其属性以创建一个动态库并选中该框以创建一个 .a 文件——链接libColors.a——构建它——然后创建 .dll 文件。 (另请注意,我将__declspec(import/export) 规范放在其classes 上)

现在我希望这个SWC.dll 在可执行文件中使用。但是,当我在可执行文件中仅包含 SWC.h 文件时,它会获得大量未定义的引用。似乎这里有问题,因为我没有在SWC.h 上调用任何函数。所以,我在我的 .exe 构建选项中添加了SWC.a,现在它构建没有错误。但是当我运行它时,它说我需要Colors.dll?我错过了什么?

【问题讨论】:

    标签: c++ codeblocks static-linking


    【解决方案1】:

    您可以使用 objdump、CFF ExplorerDependency Walker 等工具查看相关 PE-COFF 可执行文件的导入表。

    可能的解释是您的Colors 项目的编译方式并不是真正的静态库。您可以通过检查SWC.dll 和您的测试可执行文件的导入表来检查这一点。您可能会在其中一个中找到来自 Colors.dll 的导入条目,以及它尝试导入的函数。

    检查Color.h 中声明的数据和函数,并确保它们在任何地方都没有被__declspec() 修饰。如果Color.h 中的函数预处理为类似“SWC”中的__declspec(dllimport) 之类的东西,这可能会导致您看到的问题。

    【讨论】:

    • 感谢您抽出宝贵时间阅读我的问题。但我已经弄清楚这里有什么问题。我链接到 .lib 文件的过时版本。无论如何,工具的名称又是什么?如果我再次遇到这个问题,我认为这将有助于我未来的项目。它是否检查所有在该特定程序中链接的库?
    • @mr5 我已经为这些工具添加了链接。 objdump.exe 是 mingw 附带的命令行工具。您可以使用任何上述工具来查看给定的可执行文件或 dll 所依赖的 dll。
    猜你喜欢
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多