如何在链接到静态库的 DEV-CPP 中构建控制台应用程序时解决对 _imp__** 的未定义引用?

Posted

技术标签:

【中文标题】如何在链接到静态库的 DEV-CPP 中构建控制台应用程序时解决对 _imp__** 的未定义引用?【英文标题】:How to solve undefined reference to _imp__** while building a console application in DEV-CPP linked to a static library? 【发布时间】:2012-09-07 18:17:48 【问题描述】:

背景信息 我正在尝试根据 Instructions 构建 GAUL 库。

问题 好吧,我有两个 C 中的静态库,由我在 Dev-CPP Windows 7 64 位中构建,一个引用另一个。

为了测试这些,我创建了一个引用它们的控制台应用程序。

好吧,当我尝试编译时,这是我得到的日志:

> 编译器:默认编译器 > 构建 Makefile:“C:\Soft\GAUL\Makefile.win” > 执行制作... > make.exe -f > "C:\Soft\GAUL\Makefile.win" 全部 > **gcc.exe ../gaul-devel-windows/examples/struggle.o -o "struggle.exe" -L"C:/Dev-Cpp/lib" gaul-util.a gaul-devel.a* * > > gaul-util.a(memory_util.o)(.text+0x2e):memory_util.c: 未定义引用 '_imp__mem_chunk_new_real' > gaul-util.a(memory_util.o)(.text+0x6c):memory_util.c: 未定义引用 '_imp__mem_chunk_free_real' > ... > gaul-devel.a(ga_core.o)(.text+0x101):ga_core.c: 未定义对“slink_free_all”的引用 > gaul-devel.a(ga_core.o)(.text+0x360):ga_core.c: 未定义对“mem_chunk_new_real”的引用 > ... > collect2: ld 返回 1 > 退出状态 > > make.exe: *** [struggle.exe] 错误 1 > > 执行终止

认为这与gcc 命令中使用的参数有关。

实际状态 我试过了: - 将库复制到 C:\Dev-Cpp\lib - 在库名称之前使用整个地址 - 在库名称前使用 -l - 名称后不使用.a

其中任何一个都不成功。

谁能指出我正确的方向?

提前致谢。

【问题讨论】:

最新版本的 Dev-C++ 于 2005 年发布。它是一个非常过时的编译器,请考虑升级到现代版本。 我正在使用那个,因为这是我正在关注的教程中提到的那个。你有什么编译器推荐吗? 是的,GNU GCC。如果您打算仅针对窗口,请考虑将 Visual Studio 与 Visual C++ 编译器一起使用。 看起来您只是在尝试链接 2 个静态库和一个您之前从源代码编译的目标文件,对吗?另外,您确定您没有跳过说明第三部分中的第 4 步吗? @jedwards 正是,这就是我想要做的!是的,我没有跳过它! 【参考方案1】:

链接器 (ld) 的参数顺序很重要。如果你的构建失败了

gcc.exe ../gaul-devel-windows/examples/struggle.o  -o "struggle.exe" -L"C:/Dev-Cpp/lib" gaul-util.a gaul-devel.a

行,然后尝试颠倒最后两个文件的顺序:

gcc.exe ../gaul-devel-windows/examples/struggle.o  -o "struggle.exe" -L"C:/Dev-Cpp/lib" gaul-devel.a gaul-util.a

【讨论】:

"_imp__mem_chunk_new_real" 是函数指针符号,"mem_chunk_new_real" 是函数本身。我的意思是您同时使用动态链接库(gaul-util 可能使用一些 .dll)和静态链接库(gaul-devel 使用某些静态库中的 mem_chunk_new_real)。再次检查您的构建过程中的 .a 文件。【参考方案2】:

最后,正如@ThiefMaster♦ 所说,我在这种情况下使用了一个较新的构建器 VC++,它就可以工作了!

【讨论】:

以上是关于如何在链接到静态库的 DEV-CPP 中构建控制台应用程序时解决对 _imp__** 的未定义引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用cmake生成基于静态库的动态链接库

当 iOS 应用程序链接到静态库时,如何获取丢弃的符号列表?

在构建我的 C++ 可执行文件 (gcc) 时,我可以获得所有链接库的报告吗? (包括静态链接)

构建静态框架和与其他开源库的内部链接的设计方法

在 CMake 中安装静态库的调试和发布配置

为啥生成 pdb 文件会导致静态链接库的大小大幅增加?