Кросскомпиляция программ для Windows с использованием MinGW, Boost и Cmake в openSUSE
	
	
	                
  
  
  
  
		Давным-давно в далекой-далекой галактике один программист заметил, что проект скомпилированный в VisualStudio 2005 выполняется в Windows ощутимо медленнее, чем при использовании GCC в Linux. И решил программист сравнить производительности проекта при использовании VisualStudio и GCC под Windows.
Проект является приложением, написанным на языках С и С++ с использованием библиотек Boost и системы сборки CMake.
Ниже рассказывается о создании окружения для сборки проекта на базе кросскомпилятора MinGW-w64, библиотек Boost и Cmake в openSUSE 11.3 x86.
Установка MinGW и Boost
Установка не должна представлять особой сложности. MinGW-w64 есть в репозиториях openSUSE. Для компиляции приложений для Windows x86 нужно добавить в систему репозиторий http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_11.3/, а для Windows x86-64 — http://download.opensuse.org/repositories/windows:/mingw:/win64/openSUSE_11.3/.
После добавления репозитория необходимо установить следующие пакеты:
Это связано с тем, что в BSD-сокетах дискриптор сокета знаковый тип, а в Windows — беззнаковый. Если не сделать данную замену, то приложения использующие Boost.Asio, которая в Windows ожидает беззнаковый тип SOCKET не будут компилироваться. К негативным последствиям можно отнести потенциальную возможность неправильной работы приложений, которые расчитаны на то, что тип дескриптора сокета может быть только знаковым.
На этом установка окружения завершена.
DLL файлы для распространения приложения находятся в каталоге
Кросскомпиляция с использованием Cmake
Для использования кросскомпиляции в Cmake необходимо создать файл настроек, путь к которому будет передаваться cmake через задаваемый в командной строке параметр
На этом установка завершена. Теперь можно компилировать Windows-приложения прямо из рабочего оружения на Linux.
Список используемых источников
1. CmakeMingw — KitwarePublic
2. #5042 (error: redefinition of 'size_t boost::asio::detail::calculate_hash_value(SOCKET)') – Boost C++ Libraries
3. SourceForge.net: MinGW-w64 — for 32 and 64 bit Windows: Modify: 3152409 — signed SOCKET type
4. Socket Data Type (Windows)
5. Dependency Walker (depends.exe) Home Page
 
				
	  
Проект является приложением, написанным на языках С и С++ с использованием библиотек Boost и системы сборки CMake.
Ниже рассказывается о создании окружения для сборки проекта на базе кросскомпилятора MinGW-w64, библиотек Boost и Cmake в openSUSE 11.3 x86.
Установка MinGW и Boost
Установка не должна представлять особой сложности. MinGW-w64 есть в репозиториях openSUSE. Для компиляции приложений для Windows x86 нужно добавить в систему репозиторий http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_11.3/, а для Windows x86-64 — http://download.opensuse.org/repositories/windows:/mingw:/win64/openSUSE_11.3/.
После добавления репозитория необходимо установить следующие пакеты:
- mingw32-cross-binutils
- mingw32-cross-cpp
- mingw32-cross-gcc
- mingw32-cross-gcc-c++
- mingw32-headers
- mingw32-libgcc
- mingw32-libstdc++
- mingw32-runtime
- mingw32-filesystem
- mingw32-boost-devel
- mingw32-libboost_date_time
- mingw32-libboost_filesystem
- mingw32-libboost_graph
- mingw32-libboost_iostreams
- mingw32-libboost_math
- mingw32-libboost_program_options
- mingw32-libboost_random
- mingw32-libboost_regex
- mingw32-libboost_serialization
- mingw32-libboost_signals
- mingw32-libboost_system
- mingw32-libboost_test
- mingw32-libboost_thread
- mingw32-libboost_wave
- mingw32-libbz2
- mingw32-libbz2-devel
- mingw32-libexpat
- mingw32-libexpat-devel
- mingw32-icu
- mingw32-libicu
- mingw32-libicu-devel
- mingw32-zlib
- mingw32-zlib-devel
/usr/i686-pc-mingw32/sys-root/mingw/include/mingw_inc/_socket_types.h/usr/x86_64-pc-mingw32/sys-root/mingw/include/mingw_inc/_socket_types.h#if 0 typedef UINT_PTR SOCKET; #else typedef INT_PTR SOCKET; #endifна
#if 1 typedef UINT_PTR SOCKET; #else typedef INT_PTR SOCKET; #endif
Это связано с тем, что в BSD-сокетах дискриптор сокета знаковый тип, а в Windows — беззнаковый. Если не сделать данную замену, то приложения использующие Boost.Asio, которая в Windows ожидает беззнаковый тип SOCKET не будут компилироваться. К негативным последствиям можно отнести потенциальную возможность неправильной работы приложений, которые расчитаны на то, что тип дескриптора сокета может быть только знаковым.
На этом установка окружения завершена.
DLL файлы для распространения приложения находятся в каталоге
/usr/i686-pc-mingw32/sys-root/mingw/bin/usr/x86_64-pc-mingw32/sys-root/mingw/binКросскомпиляция с использованием Cmake
Для использования кросскомпиляции в Cmake необходимо создать файл настроек, путь к которому будет передаваться cmake через задаваемый в командной строке параметр
CMAKE_TOOLCHAIN_FILE-DCMAKE_TOOLCHAIN_FILE=../../cmake/toolchain/i686-pc-mingw32.cmakeФайл i686-pc-mingw32.cmake содержал следующие настрйки:
# the name of the target operating system
SET(CMAKE_SYSTEM_NAME      Windows)
SET(CMAKE_SYSTEM_PROCESSOR i686)
# which compilers to use for C and C++ and ASM-ATT
SET(CMAKE_C_COMPILER       /usr/bin/i686-pc-mingw32-gcc )
SET(CMAKE_CXX_COMPILER     /usr/bin/i686-pc-mingw32-g++ )
SET(CMAKE_ASM-ATT_COMPILER /usr/bin/i686-pc-mingw32-as  )
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH  /usr/i686-pc-mingw32
                          /usr/i686-pc-mingw32/sys-root/i686-pc-mingw32
    )
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)На этом установка завершена. Теперь можно компилировать Windows-приложения прямо из рабочего оружения на Linux.
Список используемых источников
1. CmakeMingw — KitwarePublic
2. #5042 (error: redefinition of 'size_t boost::asio::detail::calculate_hash_value(SOCKET)') – Boost C++ Libraries
3. SourceForge.net: MinGW-w64 — for 32 and 64 bit Windows: Modify: 3152409 — signed SOCKET type
4. Socket Data Type (Windows)
5. Dependency Walker (depends.exe) Home Page
     
                 
  
		
	
 
    
    
0 комментариев