Я получил сообщение об ошибке ссылки для некоторой части кодов на основе заголовочного файла armadillo в Visual Studio C ++ 2017, выполнив следующие шаги, описанные в соответствующих руководствах для x64 (с соответствующими изменениями x64-> x86).
Я скачалПоследний стабильный релиз Armadillo (armadillo-9.200.6.tar) со своего официального сайта.Я также загрузил библиотеку MKL для 64-разрядных Windows 10, работающих на процессоре Intel i5, с веб-сайта Intel.И я связал их в Visual Studio 2017 следующим образом:
Project
> Properties
> Configuration Properties
> VC++ Directories
> Include Directories
: ( Примечание: строки, начинающиеся со звездочки (), включены как часть настройки броненосца *)
* C:\Program Files (x86)\Microsoft Visual Studio\Shared\armadillo-9.200.6\include
* C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl\include
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\VS\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\winrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\cppwinrt
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\Include\um
Project
> Properties
> Configuration Properties
> VC++ Directories
> Library Directories
: ( Примечание: строки с префиксом звездочки () включены как часть настройки броненосца *)
* C:\Program Files (x86)\Microsoft Visual Studio\Shared\armadillo-9.200.6\examples\lib_win64
* C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl\lib\intel64_win
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x86
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x86
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\VS\lib\x86
C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\ucrt\x86
C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\um\x86
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x86
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\Lib\um\x86
Project
> Properties
> Configuration Properties
> C/C++
> General
> Additional Include Directories
: ( Примечание: строки с префиксом звездочки () включены как часть настройки броненосца *)
* C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl\include
* C:\Program Files (x86)\Microsoft Visual Studio\Shared\armadillo-9.200.6\include
C:\Python36_86\include
Project
> Properties
> Configuration Properties
> Linker
> General
> Additional Library Directories
: ( Примечание: строки с префиксом звездочки () включены в состав броненосцаsetup *)
* C:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2019.1.144\windows\mkl\lib\ia32_win
C:\Python36_86\libs
Project
> Properties
> Configuration Properties
> Linker
> Input
> Additional Dependencies
: ( Примечание: строки с префиксомсо звездочкой () включены как часть установки броненосца *)
* mkl_core.lib
* mkl_sequential.lib
* mkl_intel_lp64.lib
* lapack_win64_MT.lib
* blas_win64_MT.lib
Я разрабатываю модули C ++ как расширения для Python, поэтому я используюДанная целевая платформа Win32.К счастью, некоторые части кода броненосца работают нормально, в то время как для некоторых он показывает ошибку в виде списка ниже в формулировке проблемы.Это код, который я пытаюсь построить.Это в основном импортировать массивы numpy, умножить их и вернуть как объект Python.Я делаю два испытания.Пробная версия 1: умножение его обычно с использованием трех циклов for (здесь это комментируется), что успешно работает.В пробной версии 2 используется броненосец (строка, из которой происходит ошибка, указывается с помощью комментария).Код:
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <Python.h>
#include <Windows.h>
#include <cmath>
#include <vector>
#include <string>
#include <iostream>
#include <armadillo>
#define PyTuple_GET_ITEM PyTuple_GetItem
#define PyTuple_GET_SIZE PyTuple_Size
#define PyArray_FLOAT NPY_FLOAT
#include <numpy/arrayobject.h>
using namespace std;
using namespace arma;
//Taking two numpy array as arguments, multiplying the two numpy arrays and
// returning it back as python object
static PyArrayObject *mmult(PyObject *self, PyObject *args)
{
PyObject *vec1, *vec2;
(PyArg_ParseTuple(args, "OO", &vec1, &vec2));
PyArrayObject *cvec1, *cvec2;
cvec1 = (PyArrayObject*) PyArray_FROM_OTF(vec1, NPY_DOUBLE, NPY_ARRAY_IN_ARRAY);
cvec2 = (PyArrayObject*) PyArray_FROM_OTF(vec2, NPY_DOUBLE, NPY_ARRAY_IN_ARRAY);
npy_intp *shape1 = PyArray_DIMS(cvec1);
npy_intp *shape2 = PyArray_DIMS(cvec2);
npy_intp shape3[2] = { shape1[0], shape2[1] };
PyArray_Descr* cvec3_type = PyArray_DescrFromType(NPY_DOUBLE);
PyArrayObject* cvec3 = (PyArrayObject *) PyArray_Zeros(2, shape3, cvec3_type,0);
double *v1, *v2, *v3;
v1 = (double*)PyArray_DATA(cvec1);
v2 = (double*)PyArray_DATA(cvec2);
v3 = (double*)PyArray_DATA(cvec3);
/* TRIAL 1 : SUCCESSFUL
for (int i = 0; i < shape1[0]; i++) {
for (int j = 0; j < shape2[1]; j++) {
for (int k = 0; k < shape2[0]; k++) {
v3[shape3[1]*i+j] += v1[shape1[1] * i + k] *v2[shape2[1] * k + j];
}
}
}
*/
//TIRAL 2: Wih Armadillo
arma::Mat<double> A1(shape1[0], shape1[1]); //Successful
arma::Mat<double> A2(shape2[0], shape2[1]);
arma::Mat<double> A3(shape1[0], shape2[1]);
for (int i = 0; i < shape1[0]; i++) {
for (int j = 0; j < shape1[1]; j++) {
A1(i, j) = v1[shape1[1] * i + j]; //Successful
}
}
for (int i = 0; i < shape2[0]; i++) {
for (int j = 0; j < shape2[1]; j++) { //Successful
A2(i, j) = v2[shape2[1] * i + j];
}
}
A3 = A1 * A2; // -----> This is the line that is creating the errors
for (int i = 0; i < shape1[0]; i++) {
for (int j = 0; j < shape2[1]; j++) {
v3[shape3[1] * i + j] = A3(i, j);
}
}
// This piece of the code also do not work with armadillo. I took this from a demo code.
// Create a 4x4 random matrix and print it on the screen
arma::Mat<double> A = arma::randu(4, 4);
std::cout << "A:\n" << A << "\n";
// Multiply A with his transpose:
std::cout << "A * A.t() =\n";
std::cout << A * A.t() << "\n";
return cvec3;
}
//Structure: Defines how C++ function is presented to Python
static PyMethodDef mhps_methods[] = {
{ "mmult", (PyCFunction)mmult, METH_VARARGS, nullptr },
{ nullptr, nullptr, 0, nullptr }
};
//Structure: Defines module as you want it to be referred to in your Python code.
static PyModuleDef mhps_module = {
PyModuleDef_HEAD_INIT,
"mhps",
"faster codes for research modules",
0,
mhps_methods
};
//Method: Python calls this method when it loads the module using "import mhps"
PyMODINIT_FUNC PyInit_mhps() {
import_array();
return PyModule_Create(&mhps_module);
}
Это генерируемая ошибка:
module1.obj : error LNK2001: unresolved external symbol _sposv_
module1.obj : error LNK2001: unresolved external symbol _cgemv_
module1.obj : error LNK2001: unresolved external symbol _sdot_
module1.obj : error LNK2001: unresolved external symbol _sgemv_
module1.obj : error LNK2001: unresolved external symbol _zgemv_
module1.obj : error LNK2001: unresolved external symbol _dgemm_
module1.obj : error LNK2001: unresolved external symbol _sgesv_
module1.obj : error LNK2001: unresolved external symbol _zgesv_
module1.obj : error LNK2001: unresolved external symbol _sgemm_
module1.obj : error LNK2001: unresolved external symbol _dposv_
module1.obj : error LNK2001: unresolved external symbol _dgemv_
module1.obj : error LNK2001: unresolved external symbol _zposv_
module1.obj : error LNK2001: unresolved external symbol _cposv_
module1.obj : error LNK2001: unresolved external symbol _cgemm_
module1.obj : error LNK2001: unresolved external symbol _dsyrk_
module1.obj : error LNK2001: unresolved external symbol _ssyrk_
module1.obj : error LNK2001: unresolved external symbol _ddot_
module1.obj : error LNK2001: unresolved external symbol _zgemm_
module1.obj : error LNK2001: unresolved external symbol _dgesv_
module1.obj : error LNK2001: unresolved external symbol _cgesv_