【问题标题】:Another GSL linking error in WindowsWindows 中的另一个 GSL 链接错误
【发布时间】:2014-08-27 11:47:19
【问题描述】:

我已经做了所有事情,并且得到了回报。 尝试使用 Windows 7.1 SDK 从 MATLAB 编译 mex 文件。

~ 我已经在 GCC 上创建了一个已编译的 C 源代码

~我已经创建了一个 MEX 文件,它可以在 Linux 和 OS X 上通过 GCC 正常链接和编译。不会使 MATLAB 崩溃,网关功能可以正常工作

~ 经过一番困惑,我将我的开发平台从 64 位切换到 x86 Win7

~ 我找到了 .dll 构建的文件,但它们没有链接。使用 MATLAB 的链接器标志在 MATLAB 中链接库将默认为 .lib,所以...

~ 经过大量谷歌搜索后,我发现了简单、预编译的 x86 GSL .lib 和源文件,并将它们与 MATLAB 链接起来,消除了任何 gsl_blas.h-and-it's-dependencies 无法识别的外部符号错误

~ 我重写了源代码中的每一个变量声明,使其与 C89 标准兼容

~我已经适当地设置了链接器标志以避免 LIBCMT 和任何其他 LIB 冲突

~ 我已经安装了 2010 和 2012 VC C 运行库

~我已经检查以确保我的系统文件中有 msvcrt.dll 和 msvcp60.dll

~ 我已经在网上关注了多个关于如何将所有内容链接在一起的教程,其中大部分都没有损坏的链接或不可复制的结果。对于 Cygwin 或 MinGW,我没有发现太多可取之处。

~我试过用Lcc-win32 2.4.1编译器

如果我在做基本的矩阵和向量运算,我会被设置,但不幸的是,我正在使用的各种分解例程需要 cblas 库中的部分,我也链接了它,但我得到了大约 30 个错误报告同样的事情……

cblas.lib(ctrsv.obj) : error LNK2001: unresolved external symbol __libm_sse2_sqrt_precise 

这是我的 MATLAB 命令。

mex -largeArrayDims -IC:\gsl\include -LC:\gsl\lib -lgsl -lcblas LINKFLAGS="$LINKFLAGS /NODEFAULTLIB:libcmt.lib" file1.c file2.c

所以,在没有选择和沮丧的情况下,我(自然地)来到堆栈溢出。有人知道如何解决这个问题吗?我在谷歌上发现的唯一一件事是 wineHQ 错误,不是很有帮助。

而且,如果可能的话,我宁愿不尝试先在 VS201X 上编译。如有必要,我可以访问我需要的任何版本,但对我来说,这似乎是一个多余的步骤。不过,也许我被基于 Unix 的文件系统管理和链接宠坏了。

【问题讨论】:

    标签: windows matlab linker gsl


    【解决方案1】:

    MinGW下的GSL库很容易编译,实际上源码编译的过程和Linux完全一样。以下是我采取的步骤:

    1. 为 Windows 设置 MinGW。我正在使用MinGW-w64,但也有流行的TDM-GCC 发行版,它带有一个友好的网络安装程序。

    2. 获取GSL sources,并解压压缩包(gsl-1.16.tar.gz 是目前最新的)

    3. 像往常一样编译,我使用了以下命令:

      $ ./configure --host=x86_64-w64-mingw32 --prefix=/mingw/local --enable-shared --enable-static
      $ make
      $ make install
      

      应该需要几分钟才能完成。也许您可以启用并行构建以加快编译速度 (make -j)

      您最终会在/mingw/local 中安装必要的文件,并在下面使用通常的结构(binlibinclude)。

    4. 最后你可以编译一个示例程序:

      $ export PATH=/mingw/local:$PATH
      $ gcc `gsl-config --cflags` -o main main.c `gsl-config --libs`
      

    当然,如果您更喜欢使用 Visual C++ 作为编译器,人们已经准备好使用 Visual Studio 构建 GSL 的解决方案(手动创建项目文件,或使用 CMake 等构建系统)。有关此类项目,请参阅 this question

    第三个选项是使用Cygwin

    【讨论】:

    • 现在试试你的解决方案,谢谢你的回复,会让你知道它是怎么回事
    • Amro- 我不明白您将如何使用 configure、make 和 make install 命令;这是在Windows系统上。 Cygwin模拟Linux环境的同时,MinGW自带的终端仍然只支持windows命令
    • 哦,我忘了说还要获取 MSYS shell(这是一个单独的下载,不包含在其他软件包中)。我前段时间设置了我的环境,我错过了那一步 :) 所以确切地说,我当时自己使用的二进制文件是MinGW-w64MSYS
    • 你看到 MSYS 有点像 Cygwin 的分支(基于一个非常旧的版本),它提供对 Bash shell、Autotools、Make 等的支持。它旨在与 MinGW 一起使用工具链。据我了解,有人还在开发一个名为MSYS2 的更新版本,其中包括一个包管理系统(pacman 从 Arch Linux 移植)。我自己还没用过,不过还是想提一下。
    • 我设法通过brgladman.org/oldsite/computing/gnu_scientific_library.php 构建了我的源代码,然后我从那里链接了它。不过,感谢您的帮助,这是对 MinGW 的精彩介绍。
    猜你喜欢
    • 2019-02-21
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多