Ошибка 0xc000007b после сборки с флагом g cc -m32 - PullRequest
0 голосов
/ 29 января 2020

Я установил mingw-w64, потому что мне нужны функции многопоточности C ++ 11 / C11 для библиотеки выполнения armadillo (http://arma.sourceforge.net/), но мне нужно также скомпилировать программу с 32-битной DLL. Когда я компилирую эту 32-битную программу с флагом -m32, при ее запуске проблем не возникает, но когда я запускаю программу с библиотекой armadillo с этим флагом, появляется ошибка 0xc000007b. Для сборки программы с библиотекой Armadillo мне нужно связать Intel Math Kernel Library (https://software.intel.com/en-us/mkl) для 32-битной архитектуры.

Я уже пытался использовать обходчик зависимостей , но результаты ничего не проясняют.

Это командная строка, которую я использую:

g++ --std=c++11 -o PruebaArmadillo PruebaArmadillo.cpp -IC:\armadillo-9.800.4\include -LC:\mkl_32\redist\ia32_win\mkl -lmkl_rt -m32

Я работаю на windows 10 с g ++ (x86_64-posix-sjlj-rev0, Построен по проекту MinGW-W64) 8.1.0

КОД

#include <iostream>
#include <armadillo>
#include <vector>


using namespace std;
using namespace arma;

int main()
  {

    vec p = { 1, 1, 3 };
    cout << p << endl;
}

Результат

Error programa


РЕДАКТИРОВАТЬ

Чтобы прояснить некоторые аспекты, я привожу здесь результат того же кода, скомпилированного с mingw и с mingw-w64.

С mingw:

C:\MicoCode\prueba1>g++ --version
g++ (MinGW.org GCC-8.2.0-5) 8.2.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


C:\MicoCode\prueba1>g++ --std=c++11 -o PruebaArmadillo PruebaArmadillo.cpp -IC:\armadillo-9.800.4\include -LC:\mkl_32\redist\ia32_win\mkl -lmkl_rt
In file included from C:\armadillo-9.800.4\include/armadillo:171,
                 from PruebaArmadillo.cpp:4:
C:\armadillo-9.800.4\include/armadillo_bits/SpMat_bones.hpp:675:29: error: 'mutex' in namespace 'std' does not name a type
   arma_aligned mutable std::mutex cache_mutex;

Это вызывает ошибку взаимного исключения, и поэтому мне нужно использовать mingw-w64, но это дает мне ошибку, на которую я указывал в начале. Но если я использую библиотеку mkl для 64 битов, она будет работать нормально:

C:\MicoCode\prueba1>g++ --version
g++ (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


C:\MicoCode\prueba1>g++ --std=c++11 -o PruebaArmadillo PruebaArmadillo.cpp -IC:\armadillo-9.800.4\include -LC:\mkl_2\redist\intel64_win\mkl -lmkl_rt

C:\MicoCode\prueba1>PruebaArmadillo.exe
   1.0000
   1.0000
   3.0000

1 Ответ

1 голос
/ 01 февраля 2020

Наконец, я нашел решение, ошибка появилась, потому что система не может найти 32-битные библиотеки, потому что программа скомпилирована на 64-битной архитектуре. Чтобы решить эту проблему, достаточно включить эти библиотеки в качестве переменной среды пути. 32-битная библиотека, в которой она находится: C:\---\mingw64\x86_64-w64-mingw32\lib32

...