2014-04-28 4 views
1

У меня есть проблемы с кросс-компиляционной программой на C++, которая использует библиотеку openMP. Я использую Linux Ubuntu 12.04 LTS. Я хочу получить исполняемый файл, запускаемый в Windows.OMP Cross compilation с x86_64-w64-mingw32-g ++

У меня нет никаких проблем с компиляцией моей программы с OMP с регулярной командой г ++:

g++ a.cpp b.cpp -o OMPres -pg -O3 -I./CBLAS/include -L./ -lcblas 

Кроме того, когда я пытаюсь crosscompilation без OMP, все работает прекрасно:

x86_64-w64-mingw32-g++ a.cpp b.cpp -O3 -I./CBLAS/include ./CBLAS/cblas_WIN64.a ./BLAS/blas_WIN64.a -o res.exe -l gfortran -static 

Но когда я пытаюсь для перекрестного копирования его с помощью OMP, используя следующую команду:

x86_64-w64-mingw32-g++ a.cpp b.cpp -O3 -I./CBLAS/include ./CBLAS/cblas_WIN64.a ./BLAS/blas_WIN64.a -o OMPres.exe -l gfortran -static -fopenmp

Я получаю эту ошибку: a.cpp: 41: 17: фатальная ошибка: omp.h: Нет такого файла или каталога компиляция завершена.

Я нашел, где файл omp.h находится на моем диске, и добавил путь к команде. После его выполнения:

x86_64-w64-mingw32-g++ a.cpp b.cpp -O3 -I./CBLAS/include -I/usr/lib/gcc/x86_64-linux-gnu/4.6/include ./CBLAS/cblas_WIN64.a ./BLAS/blas_WIN64.a -o OMPres.exe -l gfortran -static -fopenmp 

я получил другую ошибку: x86_64-w64-mingw32-г ++: Ошибка: libgomp.spec: Нет такого файла или каталога

Как я и есть этот файл на диске Я попытался скопировать его в разных местах и, наконец, работал, когда я скопировал его прямо в каталог, где происходит компиляция. Тогда он произвел еще одну ошибку:

/USR/бен/x86_64-w64-mingw32-л.д.: не может найти -lgomp /USR/бен/x86_64-W64-mingw32-LD: не может найти -lrt collect2: Л.Д. вернулся 1 статус выхода

У меня нет четкого представления о том, как работают компиляторы. Я попытался обновить все компиляторы mingw-w64, которые я смог найти с помощью поиска apt-cache, но ничего не помогло. Я понятия не имею, что еще я могу делать :(.

ответ

1

Во-первых, @nmaier полностью верен, потому что инструментальная цепочка Ubuntu x86_64-w64-mingw32 искалечена и что вы можете перестроить инструментальную цепочку самостоятельно.

Я, однако, предполагаю, что вы используете MXE, что экономит ваше время ручной компиляции gcc и каждой его зависимости. Для этой цели должно быть достаточно следующих шагов:

# Get MXE 
git clone https://github.com/mxe/mxe.git && cd mxe 

# Settings 
cat <<EOF > settings.mk 
MXE_TARGETS := x86_64-w64-mingw32.static 
JOBS := 4 
EOF 

# Build gcc, libgomp, blas, and cblas. It will take a while 
make -j2 libgomp cblas 

# Add toolchain to PATH 
# See http://htmlpreview.github.io/?https://github.com/mxe/mxe/blob/master/index.html#tutorial step 4 
export PATH=`pwd`/usr/bin:$PATH 

# You don't need -I./CBLAS/include ./CBLAS/cblas_WIN64.a ./BLAS/blas_WIN64.a 
# because headers and libraries are installed to standard location and 
# I already used `-lcblas -lblas`. 
x86_64-w64-mingw32-g++ a.cpp b.cpp -fopenmp -O3 -o res.exe -lcblas -lblas -lgfortran -lquadmath 
+0

Спасибо! До сих пор это работало отлично. Я должен включить также дополнительную библиотеку, и я надеюсь, что она будет работать так же хорошо :) –

1

Вашего x86_64-w64-mingw32 Набор инструментов, кажется, были строить без libgomp.

  • Вы можете проверить поставщик/распределение, если оно есть дополнительные или вариант пакеты, которые имеют libgomp .
  • или переключиться на другой поставщик/распределения.
  • или вы могли бы восстановить (или построить в первую очередь) крест gcc с --enable-libgomp. Это любопытное трудный путь.

PS: Добавление дорожек, которые не соответствуют с вашей платформы, как -I/usr/lib/gcc/x86_64-linux-gnu/4.6/include, это плохая идея, в общем, и, безусловно, не в состоянии ... Это своего рода создает Франкен-компилятор.

Смежные вопросы