【问题标题】:How and when is static linking performed (MinGW)?如何以及何时执行静态链接 (MinGW)?
【发布时间】:2010-12-10 01:37:12
【问题描述】:

在将 C++ 应用程序链接到另一个具有 Fortran90 依赖项(MinGW、TDM g++ 和 gfortran)的 C++ 库时,我遇到了很多麻烦。我要么必须使用 gfortran 进行链接,要么应用程序在启动时崩溃(在键入 __cxa_get_globals_fast 的全局构造函数中)。但是这是不可接受的,我想使用 g++ 进行链接(Qt GUI)。

在我看来,库的依赖关系不能用 gcc 静态链接,链接仅在 main() 可用时执行。为什么?

我猜部分是因为某些初始化的代码必须在 main() 之前插入。

为什么静态链接的应用程序需要DLL-s,比如运行时的mingwm10.dll或pthreadGCE2.dll?为什么这些不能静态链接?

更新:我刚刚找到了这些网站:
http://www.deer-run.com/~hal/sol-static.txt
http://www.iecc.com/linker/

【问题讨论】:

    标签: c++ static linker mingw fortran


    【解决方案1】:

    使用 gfortran 链接和使用 ld/gcc/g++ 链接的主要区别在于 gfortran 默认链接标准 fortran 库,而使用另一个链接器则需要手动指定要链接的库。我无法通过快速搜索找到它们,但它应该与 -lgfortran 类似。

    此外,gfortran 有一些特定的instructions for initialisation routines,如果您的主程序不是用 fortran 编写的,则需要调用某些 fortran 内在函数才能工作。如果您没有调用这些例程,那么这可能会导致崩溃。

    【讨论】:

    • 你指的是这个吗?非 Fortran 主程序:gcc.gnu.org/onlinedocs/gfortran/… 这是我的应用程序的回溯:#0 0x00777520 in global constructors keyed to __cxa_get_globals_fast () #1 0x0077ef87 in __do_global_ctors () #2 0x0040122a in __mingw_CRTStartup () #3 0x00401298 in mainCRTStart /跨度>
    【解决方案2】:

    为什么静态链接的应用程序在运行时需要DLL-s,例如mingwm10.dll或pthreadGCE2.dll?为什么这些不能静态链接?

    它们可以,但由于动态库的基本优势,不提供静态库版本:无需重新构建可执行文件即可修复错误。

    【讨论】:

    • 你能告诉我这些是如何静态链接的吗?我应该从源代码构建自己的静态库吗?
    • 只要在libpath 中有.lib 变体,它们就会被使用。不过,您必须自己构建它们。
    猜你喜欢
    • 2013-02-14
    • 2020-11-04
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多