Как скомпилировать 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 шт):

Автор решения: givename

Поменял порядок в 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

→ Ссылка
Автор решения: HolyBlackCat

По канону, все эти настройки кросс-компиляции кладутся в отдельный тулчейн-файл, который потом передается во флаг -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
→ Ссылка