В моем решении C ++ у меня есть DLL. Моя DLL использует классы Octave C ++, а также использует Octave в качестве «встроенного» движка. Используя следующие шаги (1-й метод), я могу построить свое решение C ++ и запустить встроенный исполняемый файл и получить результаты вывода в некоторых текстовых файлах без каких-либо проблем:
The steps of using Octave Libraries in Visual Studio C++ 2008:
1- Download Octave 3.6.1 for Visual Studio 2008 by the following link.
Notice that there two options for download, one for VS2010 and one for VS2008, you should download the VS2008 option.
http://sourceforge.net/projects/octave/files/Octave%20Windows%20binaries/Octave%203.6.1%20for%20Windows%20Microsoft%20Visual%20Studio/
2- Install the Octave 3.6.1 on your system in the following directory (which contains NO white spaces):
C:\Software\Octave-3.6.1
3- While installing, on the installation wizard, select all the available packages of the Octave 3.6.1 to be installed, also select "gnuplot.exe" as graphics engine.
4- After installing Octave 3.6.1, include the Octave 3.6.1 header files in your C++ code like below:
#include <octave/oct.h>
#include <octave/octave.h>
#include <octave/config.h>
5- Configure your VS2008:
Add the following directories to "Property Pages > Configuration Properties > C/C++ > General >Additional Include Directories:"
C:\Software\Octave-3.6.1\include
C:\Software\Octave-3.6.1\include\octave-3.6.1
6- Configure your VS2008:
Add the following directories to "Property Pages > Configuration Properties > Linker > General > Additional Library Directories:"
C:\Software\Octave-3.6.1\lib
C:\Software\Octave-3.6.1\lib\octave\3.6.1
7- Configure your VS2008:
Change the "Property pages > Configuration Properties > Linker > General > Enable Incremental Linking" to "No."
8- Configure your VS2008:
Add the following files to "Property Pages > Configuration Properties > Linker > Input > Additional Dependencies:"
octave.lib
octinterp.lib
cruft.lib
9- Configure your VS2008:
Enter the following path to "Property Pages > Configuration Properties > Debugging >
Environment:"
PATH=%PATH%;C:\Software\Octave-3.6.1\bin;
10- Use the following command before loading my DLL:
SetDllDirectory((LPCWSTR)L"C:\\Software\\Octave-3.6.1\\bin\\");
Но когда я пытаюсь использовать следующие шаги (2-й метод), у меня возникает проблема (я объясню проблему):
The steps of using Octave Libraries in Visual Studio C++ 2008:
1- Download Octave 3.6.1 for Visual Studio 2008 by the following link.
Notice that there two options for download, one for VS2010 and one for VS2008, you should download the VS2008 option.
http://sourceforge.net/projects/octave/files/Octave%20Windows%20binaries/Octave%203.6.1%20for%20Windows%20Microsoft%20Visual%20Studio/
2- Install the Octave 3.6.1 on your system in the following directory (which contains NO white spaces):
C:\Software\Octave-3.6.1
3- While installing, on the installation wizard, select all the available packages of the Octave 3.6.1 to be installed, also select "gnuplot.exe" as graphics engine.
4- After installing Octave 3.6.1, copy the folder "Octave-3.6.1" at the address "C:\Software\Octave-3.6.1" next to the solution file of visual studio 2008 project (*.sln) and then include the Octave 3.6.1 header files in your C++ code like below:
#include <octave/oct.h>
#include <octave/octave.h>
#include <octave/config.h>
5- Configure your VS2008:
Add the following directories to "Property Pages > Configuration Properties > C/C++ > General >Additional Include Directories:"
..\Octave-3.6.1\include
..\Octave-3.6.1\include\octave-3.6.1
6- Configure your VS2008:
Add the following directories to "Property Pages > Configuration Properties > Linker > General > Additional Library Directories:"
..\Octave-3.6.1\lib
..\Octave-3.6.1\lib\octave\3.6.1
7- Configure your VS2008:
Change the "Property pages > Configuration Properties > Linker > General > Enable Incremental Linking" to "No."
8- Configure your VS2008:
Add the following files to "Property Pages > Configuration Properties > Linker > Input > Additional Dependencies:"
octave.lib
octinterp.lib
cruft.lib
9- Configure your VS2008:
Enter the following path to "Property Pages > Configuration Properties > Debugging > Environment:"
PATH=%PATH%;..\Octave-3.6.1\bin;
10- Use the following command before loading my DLL:
SetDllDirectory((LPCWSTR)L"..\\Octave-3.6.1\\bin\\");
Проблема в том, что когда я использую 2-й метод, он прекрасно работает, поскольку я сохраняю папку установки C:\Software\Octave-3.6.1
нетронутым. Я имею в виду, когда я переименовываю папку установки, или когда я удаляю ее, или когда я удаляю Octave, мое решение компилирует и создает исполняемый файл, но при запуске исполняемого файла он не будет генерировать никаких результатов (результаты представляют собой набор текстовых файлов и выходные файлы будут пустыми). Мне было интересно, если кто-нибудь знает причину и решение. Благодарю.
@ Энди, как и просил Энди, я показал ниже раздел моего кода на C ++, который использует Octave в качестве встроенного движка. Переменные с m_
Префикс являются членами FDD
класс для которого getCPSD
Способ реализован ниже.
void FDD::getCPSD(){
int argc=int(2);
string_vector argv=string_vector(argc);
argv(0)="embedded";
argv(1)="-q";
octave_main(argc,argv.c_str_vec(),1);//start Octave interpreter as embedded engine, because cpsd command is an "m file" not C++ class
octave_value_list OVL_in_pkg;
OVL_in_pkg(0)="load";
OVL_in_pkg(1)="signal";
feval("pkg",OVL_in_pkg,0);//load signal package of octave (cpsd command is inside signal package)
octave_value_list OVL_in_hanning;
octave_value_list OVL_out_hanning;
OVL_in_hanning(0)=m_int_SamplingFreq * NFFT_FS_RATIO;//NFFT
OVL_out_hanning=feval("hanning",OVL_in_hanning,1);
octave_value_list OVL_in_cpsd;
octave_value_list OVL_out_cpsd;
OVL_in_cpsd(2)=OVL_out_hanning(0);//WINDOW (get from hanning)
OVL_in_cpsd(3)=CPSD_OVERLAP;//OVERLAP
OVL_in_cpsd(4)=m_int_SamplingFreq * NFFT_FS_RATIO;//NFFT
OVL_in_cpsd(5)=m_int_SamplingFreq;//FS
for(int i=int(0);i<m_int_NumChann;i++){
OVL_in_cpsd(0)=m_MatrixOfChannels.column(i);
for(int j=int(0);j<m_int_NumChann;j++){
OVL_in_cpsd(1)=m_MatrixOfChannels.column(j);
OVL_out_cpsd=feval("cpsd",OVL_in_cpsd,2);
m_OVL_AmplitudesAndPhaseFromCPSD(i*m_int_NumChann+j) =OVL_out_cpsd(0).complex_column_vector_value();
m_OVL_FreqFromCPSD(i*m_int_NumChann+j) =OVL_out_cpsd(1).column_vector_value();
}
}
m_ColumnVector_F = m_OVL_FreqFromCPSD(0).column_vector_value();
m_int_NumOfFreqIndexPoints = m_OVL_FreqFromCPSD(0).column_vector_value().length();
//clean_up_and_exit(0);//for closing the embedded Octave engine, but instead, it closes the whole program! Therefore, I skipped this line!
}