Создать exe-файл в Linux с использованием cmake

154
02 марта 2018, 17:25

Необходимо под Linux системой (Ubuntu 17) собрать проект с использованием cmake.

Как можно это реализовать, и если это недопустимо, то как это добиться успеха используя какой-нибудь кросс-компилятор (например, mingw), если нужно при этом подключить библиотеки. С использованием mingw возникли проблемы, при запуске полупустого проекта возникает ошибка "Отсутствие библиотеки libstdc++6..."

Answer 1

Если Ваш проект чисто собирается под линуксом и у Вас установлен mingw32 или mingw64, сделайте следующее:

1) создайте отдельный каталог для сборки проекта под виндовсы в каталоге, где- лежит Ваш CMakeLists.txt и зайдите в него

$ mkdir mingw && cd mingw

2) запустите генератор, который создаст Makefie-иерархию для кросс-компилятора mingw

$ cmake -DCMAKE_TOOLCHAIN_FILE=/usr/share/mingw/toolchain-mingw32.cmake ..

или

$ cmake -DCMAKE_TOOLCHAIN_FILE=/usr/share/mingw/toolchain-mingw64.cmake ..

(Путь к тулчейну отредактируйте как нужно в Вашей системе)

3) запустите сборку

$ make

4) если все прошло как надо, проверьте работу под wine

5) если под wine работает, соберите под виндовсы пакет с необходимым рантаймом -- для запуска под живыми виндовсами кроме самой программы нужно взять .dll-и, что лежат в /usr/x86_64-w64-mingw32/sys-root/mingw/bin или /usr/i686-w64-mingw32/sys-root/mingw/bin (Это у меня в федоре они там, где у Вас, не знаю -- посмотрите сами)

libatomic-1.dll
libgcc_s_seh-1.dll
libgsl-0.dll
libgslcblas-0.dll
libssp-0.dll
libstdc++-6.dll
libwinpthread-1.dll

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

Для сборки, используя MSVC, нужно собирать под виндовсами. Процесс выглядит так:

1) Открываем cmd-среду из установленных в меню Программы при установке MSVCxx

2) переходим в каталог сборки (предполагаем, что он в создан каталоге, где лежит Ваш CMakeLists.txt)

3) запускаем cmake

> cmake ..

или указывая генератор явно, если рабочая платформа не целевая (кросскомпиляция)

> cmake -G "Visual Studio xx Win64" ..

Генератор создаст проект

  1. Собираем проект

    > msbuild project.vcxproj (или project.sln)

В CMakeLists.txt следует указать, что Вы не будете использовать _s() шлак, который MS ввела в свой компилятор с целью разрушения стандарта C++, поскольку адекватную реализацию его она осилить не в состоянии. Я использую следующее:

if (MSVC)
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:LIBCMT")
    add_definitions(/W4 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127)
    add_definitions(/D _CRT_SECURE_NO_WARNINGS)
elseif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUC)
    add_definitions(-Wall -W)
else ()
    message ("Unknown compiler")
endif ()
READ ALSO
В чем ошибка: при вводе или выводе?

В чем ошибка: при вводе или выводе?

Почему при вводе 11 фамилий выводится только 10 фамилий?

145
Зависимости из NuGet в CMake

Зависимости из NuGet в CMake

Есть win проект на c++, который нужно перенести на linuxПервым шагом было решено перейти с солюшенов студии на CMake

116
Ошибка “исключение нарушения доступа” в С++

Ошибка “исключение нарушения доступа” в С++

Есть консольная программа, которая записывает в файл в бинарном формате таблицу или считывает ее же из бинарного файлаДля того чтобы записать...

139
Что такое .inc файлы [требует правки]

Что такое .inc файлы [требует правки]

Зачем нужныinc файлы, и что в них записывают?

123