【问题标题】:Compiling 32bit matlab application on 64 bit machine (c++)在 64 位机器上编译 32 位 matlab 应用程序 (c++)
【发布时间】:2012-01-18 09:09:34
【问题描述】:

我目前正在 64 位机器上用 c++ 构建一个 32 位 MatLab 引擎应用程序,并安装了 64 位 MatLab。但是,我确实为 MatLab 引擎提供了 32 位的所有 dll 和库文件。库文件和 dll 已正确加载(我可以编译和启动应用程序而不会出现使用 64 位 dll/libs 时会出现的任何错误),但 32 位 dll 显然会启动 64 位 matlab 可执行文件,因此,一旦我尝试对引擎做某事,我的程序就会崩溃。有没有办法让我的应用程序启动 32 位 matlab 可执行文件而不是 32 位可执行文件?

提前致谢!

【问题讨论】:

    标签: c++ matlab 32bit-64bit


    【解决方案1】:

    这是可能的,但它非常混乱:在我看来,整个 mbuild/deploytool 系统都是 cr*p 的一部分。 deploytool.bat 的第一个问题是,虽然有一个'-win32' 选项,但当没有从 32 位安装目录调用 deploytool 时,它没有任何效果。第二个问题是 mbuild 选项是为 32 位和 64 位版本共享的,因此必须手动指定它们,否则会使用错误的编译器选项。

    这是我在安装了 VS2010 的 64 位 Windows 机器上编译 32 位和 64 位时所做的一些事情。

    • 您必须同时安装 32 位和 64 位 matlab 版本
    • 您必须从命令行执行所有操作
    • 您永远无法通过 deploytool ui 编辑您的 .prj 文件,因为它会破坏对它们所做的所有手动更改。 (嗯,这实际上是一个好处,因为现在至少您可以将它们存储在 VCS 中)
    • 通过将<param.c.cpp.options.file> 添加到“配置”部分下的prj 来指向正确的编译器选项(见下文)
    • 通过手动提供 32 位安装的 deploytool.bat 的完整路径来构建

    prj 中的选项文件配置:

    <deployment-project>
      <configuration ....>
        ....
        <param.c.cpp.options.file>${MATLAB_ROOT}\bin\win32\mbuildopts\msvc100compp.bat</param.c.cpp.options.file>
        ....
    

    请注意,32 位和 64 位版本的输出目录等将相同。实际上,如果您必须为多个项目执行此操作,这将变得完全无法管理。所以我有一个 msbuild 脚本让生活更轻松:基本上在 prj 文件中,我用宏替换所有与平台相关的内容(输出目录、matlab 根目录、选项文件位置),然后让 msbuild 复制 prj 并执行正则表达式查找/替换具有取决于平台的值的宏。这允许在两个平台上使用相同的 prj。

    更新

    在对我们的项目进行了一些重大更改之后,我们发现最终处理 matlab prj 文件的麻烦并不值得。相反,我们通过直接调用mcc 并将属于项目的所有文件提供给它,大大简化了一切。这是相关的msbuild代码;为了清楚起见,跳过了一些错误检查:

    <Target Name="BuildMatlabProject">
      <PropertyGroup Condition="$(MlPlatform)=='x86'">
        <MlMatlabBinDir>$(MlMatlabx86Dir)\bin\win32</MlMatlabBinDir>
      </PropertyGroup>
      <PropertyGroup Condition="$(MlPlatform)=='x64'">
        <MlMatlabBinDir>$(MlMatlabx64Dir)\bin\win64</MlMatlabBinDir>
      </PropertyGroup>
      <ItemGroup>
        <MlMFiles Include="$(MlMatlabProjDir)\*.m"/>
        <MlMResources Include="$([System.IO.Directory]::GetDirectories(&quot;$(MlMatlabSrcDir)&quot;))"/>
      </ItemGroup>
      <PropertyGroup>
        <MlMresourcseString Condition="@(MlMResources)!=''"> -a @(MlMResources, ' -a ')</MlMresourcseString>
      </PropertyGroup>
      <RemoveDir Directories="$(MlOutDir)" ContinueOnError="true"/>
      <MakeDir Directories="$(MlOutDir)"/>
      <Exec Command="$(MlMatlabBinDir)\mcc -W cpplib:$(MlOutputName)_$(MlPlatform)
     -T link:lib -d $(MlOutDir) -f $(MlMatlabBinDir)\mbuildopts\msvc100compp.bat
     -w enable:specified_file_mismatch -w enable:repeated_file -w enable:switch_ignored
     -w enable:missing_lib_sentinel -w enable:demo_license -v
     @(MlMFiles, ' ') $(MlMresourcseString)"/>
    </Target>
    

    它需要这些属性:

    • MlPlatform:x86 构建 32 位,x64 构建 64 位
    • MlMatlabx86Dir:matlab 32 位安装目录的路径
    • MlMatlabx64Dir:matlab 64bit 安装目录的路径
    • MlMatlabProjDir:带有要编译的 m 文件的“项目”目录的路径
    • MlMatlabSrcDir:带有额外源 m 文件的路径
    • MlOutDir:输出目录
    • MlOutputName:输出名称

    【讨论】:

    • 哇...感谢您的回答。我想我只是要卸载 MatLab 64 位并安装 32 位。我真的不需要导出到 64 位,我只是希望有一种简单的方法可以编译到 32 位,而无需安装 32 位 MatLab。顺便说一句,我根本没有手动使用 deploytool。我只是让 vs2010 为我编译一切。
    • 我只是更好地阅读了您的答案,但我仍然不明白为什么我的程序不起作用:我不使用 matlab 中的任何构建工具,我只是包含并链接到 lib 的和dll,所以我的程序可以使用引擎。据我了解,deploytool 只是一个使用 MEX 文件正确设置编译程序的工具。但是,我不构建 MEX 文件,而是手动配置所需的设置。但是,必须有可能以某种方式设置设置,以便我可以导出到 32 位,而无需安装 32 位版本,对吧?
    • @Tiddo 你用什么库?在我的 64 位安装中,extern/lib/win64 下只有 64 位库,因此它们不可能用于构建 32 位版本
    • 不,但是在我的大学里,我们有一些安装了 32 位的计算机(这就是它需要为 32 位构建的原因),所以我从那里复制了它。没有这些库,程序根本无法编译。使用 64 位 DLL 可以编译,但程序无法启动引擎。使用 32 位 dll 和 lib,它会启动,但正如我在第一篇文章中所说,一旦我用它做某事,它就会失败。
    • 在这种情况下:您确定运行时使用的 所有 dll 都在您的路径中吗?不只是mclmcrt,在bin/win32目录下大概有50个dll,而且对于32位都是不同的,而且几乎都是运行引擎使用的
    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 2011-10-25
    • 2010-10-01
    • 1970-01-01
    • 2014-07-01
    • 2020-11-25
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多