Как скомпилировать c++ из под linux для windows
Я хочу скомпилировать C++ код на linux под windows, используя cmake и mingw
CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project (artlab1)
add_executable(artlab1 main.cpp)
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-c++)
set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
main.cpp
#include <iostream>
#include <conio.h>
int main(int argc, char **argv) {
std::cout << "Hello world";
return 0;
}
Консоль
Scanning dependencies of target artlab1
[ 50%] Building CXX object CMakeFiles/artlab1.dir/main.cpp.o
[100%] Linking CXX executable artlab1
x86_64-w64-mingw32-c++: error: unrecognized command line option ‘-rdynamic’
make[2]: *** [CMakeFiles/artlab1.dir/build.make:84: artlab1] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/artlab1.dir/all] Ошибка 2
make: *** [Makefile:84: all] Ошибка 2
Что с этим делать?
Ответы (2 шт):
Поменял порядок в CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-c++)
set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
project(artlab1)
...
И всё стало собираться, вообщем нужно учить cmake
По канону, все эти настройки кросс-компиляции кладутся в отдельный тулчейн-файл, который потом передается во флаг -DCMAKE_TOOLCHAIN_FILE=мой_тулчейн.cmake.
Пятиминутка хвастовства: у меня есть отличные скрипты для кросс-компиляции под винду. Там основной интерес в загрузке готовых библиотек из репозиториев MSYS2, но автоматическое подсовывание тулчейн-файла в CMake тоже есть:
# Сначала ставим Clang и LLD. Потом:
git clone https://github.com/holyblackcat/quasi-msys2
cd quasi-msys2/
make install _gcc
env/shell.sh
В открывшемся шелле cmake запускается сразу с правильным тулчейном:
mkdir build
cd build
cmake ..
make
Бонус - виндовые экзешники автоматически запускаются в wine:
./artlab.exe