2011-12-12 41 views
7

Tôi hiện đang xây dựng ứng dụng động cơ MatLab 32 bit trong C++ trên máy 64 bit, với cài đặt MatLab 64 bit. Tuy nhiên, tôi có tất cả các file dll và thư viện trong 32-bit cho động cơ MatLab. Các tập tin thư viện và dll được tải đúng (tôi có thể biên dịch và khởi động ứng dụng mà không gặp bất kỳ lỗi nào tôi nhận được khi sử dụng dll/lib 64 bit), nhưng dll 32 bit dường như khởi chạy thực thi matlab 64 bit, vì vậy chương trình của tôi bị treo ngay khi tôi cố gắng làm điều gì đó với động cơ. Có cách nào tôi có thể làm cho ứng dụng của tôi khởi chạy thực thi MATLAB 32 bit thay vì phiên bản 32 bit không?Biên dịch ứng dụng MATLAB 32 bit trên máy 64 bit (c + +)

Cảm ơn trước!

Trả lời

9

Có thể, nhưng nó vô cùng lộn xộn: toàn bộ hệ thống mbuild/deploytool là một phần của ý kiến ​​của tôi. Vấn đề đầu tiên với deploytool.bat là, mặc dù có một tùy chọn '-win32', điều đó không có tác dụng gì khi deploytool không được gọi từ thư mục cài đặt 32bit. Vấn đề thứ hai là các tùy chọn mbuild được chia sẻ cho các phiên bản 32 và 64 bit, do đó chúng phải được chỉ định bằng tay vì các tùy chọn trình biên dịch sai được sử dụng.

Dưới đây là một số điều tôi đã làm để biên dịch cả 32bit và 64bit từ một máy tính Windows 64 bit với VS2010 được cài đặt.

  • bạn phải cài đặt cả 32bit và 64bit phiên bản matlab
  • bạn sẽ phải làm tất cả mọi thứ từ dòng lệnh
  • bạn không bao giờ có thể chỉnh sửa các file .prj chưa qua ui deploytool vì nó vít lên tất cả thay đổi thủ công được thực hiện cho họ. (tốt, đó thực sự là một lợi ích từ bây giờ ít nhất bạn sẽ có thể lưu trữ chúng trong một VCS)
  • trỏ đến các tùy chọn trình biên dịch chính xác bằng cách thêm <param.c.cpp.options.file> vào phần prj trong phần 'cấu hình' (xem bên dưới)
  • xây dựng bởi manully cho đường dẫn đầy đủ đến deploytool.bat của quá trình cài đặt 32 bit

tùy chọn tập tin config trong prj:

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

Lưu ý rằng sản lượng dir vv sẽ giống nhau cho 32bit và phiên bản 64 bit. Trong thực tế, nếu bạn phải làm điều này cho nhiều dự án, điều này trở nên hoàn toàn không thể quản lý được. Vì vậy, tôi có một kịch bản msbuild để làm cho cuộc sống dễ dàng hơn: về cơ bản trong tệp prj tôi thay thế mọi nền tảng phụ thuộc (đầu ra dir, thư mục gốc matlab, tùy chọn vị trí tệp) bằng macro, sau đó hãy để msbuild sao chép prj và thực hiện regex tìm/thay thế các macro có giá trị tùy thuộc vào nền tảng. Điều này cho phép sử dụng cùng một prj cho cả hai nền tảng.

Cập nhật

Sau một vài thay đổi lớn cho các dự án của chúng tôi, chúng tôi phát hiện ra rằng cuối cùng những rắc rối đối phó với các file prj matlab là không có giá trị nó. Thay vào đó, chúng tôi đơn giản hóa mọi thứ bằng cách gọi trực tiếp mcc và cấp dữ liệu đó với tất cả các tệp thuộc về một dự án.Đây là mã msbuild có liên quan; một số kiểm tra lỗi bỏ qua cho rõ ràng:

<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> 

Nó cần những thuộc tính:

  • MlPlatform: x86 để xây dựng 32 bit, x64 để xây dựng 64 bit
  • MlMatlabx86Dir: đường dẫn đến matlab 32bit cài đặt dir
  • MlMatlabx64Dir: đường dẫn đến matlab 64bit cài đặt dir
  • MlMatlabProjDir: đường dẫn đến 'dự án' dir với các tệp m để biên dịch
  • MlMatlabSrcDir: đường dẫn với nguồn phụ m-file
  • MlOutDir: sản lượng thư mục
  • MlOutputName: Tên sản lượng
+1

Wow ... Cảm ơn câu trả lời của bạn. Tôi nghĩ rằng tôi sẽ gỡ bỏ cài đặt MatLab 64-bit và cài đặt 32-bit. Tôi không thực sự cần phải xuất khẩu sang 64-bit, tôi đã chỉ hy vọng có một cách dễ dàng để biên dịch sang 32-bit mà không cần phải cài đặt 32-bit MatLab. Nhân tiện, tôi không sử dụng deploytool một cách thủ công. Tôi chỉ cho vs2010 biên dịch mọi thứ cho tôi. – Tiddo

+1

Tôi chỉ đọc câu trả lời của bạn tốt hơn một chút, nhưng tôi vẫn không hiểu lý do tại sao chương trình của tôi không hoạt động: Tôi không sử dụng bất kỳ buildtools nào từ MATLAB, tôi chỉ bao gồm và liên kết đến lib và dll's, vì vậy chương trình của tôi có thể sử dụng động cơ. Theo như tôi có thể hiểu, deploytool chỉ đơn giản là một công cụ biên dịch chương trình với các thiết lập chính xác cho các tệp MEX. Tuy nhiên, tôi không xây dựng một tệp MEX và tôi định cấu hình cài đặt theo cách thủ công mà tôi cần. Nhưng hơn nó có thể được có thể trong một số cách để thiết lập các thiết lập theo cách mà tôi có thể xuất khẩu đến 32 bit mà không cần phải cài đặt một phiên bản 32-bit phải không? – Tiddo

+1

@Tiddo bạn sử dụng libs nào? Trong cài đặt 64 bit của tôi, chỉ có 64bit libs trong extern/lib/win64 nên chúng không thể được sử dụng để xây dựng phiên bản 32bit – stijn

Các vấn đề liên quan