Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Как компилировать на Linux и на Windows одновременно, используя CMake?

#cpp #linux #windows #cmake #cross_compiling


Я пишу всё с Linux-а, и все проекты, соответственно, собираются исключительно под Linux.
Недавно я нашёл, что с помощью MinGW можно компелировать с Линукса проекты на винду.
Попробовал "Hello, World!" - проверил - получилось. Это меня обрадовало. Попробовал
немножечко переделать один из своих давних проектов, который использовал несколько
сторонних библиотек, и вот тут начались трудности.

Очевидно, что для Windows пойдут только соответствующие библиотеки. Скачал, вроде
всё правильно настроил в CMake-е, но... Любимый undefined  reference встретил меня
с улыбкой.

Мой CMake:

cmake_minimum_required(VERSION 3.10)
project(DiSqProj)

set(CMAKE_CXX_STANDARD 17)


if (false) # Unix

    message("Building project for Unix.")

    set(LIBS
        -lGL -lGLEW -lglfw
        -lsfml-graphics
        -lsfml-window
        -lsfml-system)

elseif(true) # Win64

    message("Building project for Win64.")

    set(WIN_LIBS_DIR
        /home/prunkles/Dev/CLionProjects/WinLibs)

    set(INCLUDE_DIRS
        PUBLIC ${WIN_LIBS_DIR}/glew-2.1.0/include # GLEW include
        PUBLIC ${WIN_LIBS_DIR}/glfw-3.2.1/include # GLFW include
        PUBLIC ${WIN_LIBS_DIR}/SFML-2.5.0/include # SFML include
        PUBLIC ${WIN_LIBS_DIR}/glm/include # GLM include
    )

    set(LINK_DIRS
        ${WIN_LIBS_DIR}/glew-2.1.0/lib/Release/x64 # GLEW lib
        ${WIN_LIBS_DIR}/glfw-3.2.1/lib-mingw-w64 # GLFW lib
        ${WIN_LIBS_DIR}/SFML-2.5.0/lib # SFML lib
    )

    set(LIBS
        glew32s
        glfw3
        sfml-graphics
        sfml-window
        sfml-system
    )

endif()

link_directories(${LINK_DIRS})

add_executable(${PROJECT_NAME}
    main.cpp
    DiamondSquare.cpp DiamondSquare.h
    rand-adv.h
    inWin3D.cpp
    inWin2D.cpp inFiles.cpp
    ViewTypes.h
    genImageFromMap.cpp genImageFromMap.h
    Camera.cpp Camera.h
    GLLoadShaders.h)

target_include_directories(${PROJECT_NAME}
    ${INCLUDE_DIRS})

target_link_libraries(${PROJECT_NAME}
    ${LIBS})

    


Ответы

Ответ 1



Приведённый Вами пример плох тем, что в нём явно указаны библиотеки и хедеры, которые, вообще говоря, зависят от платформы. Не надо так делать. Используемые Вами библиотеки имеют или поставляют сами описания для их сборки/подключения в проект в виде так называемого пакета, который следует подключить с помощью find_package. Вначале как обычно: cmake_minimum_required(VERSION 3.10) project(DiSqProj) set(CMAKE_CXX_STANDARD 17) Затем ищем зависимости: find_package(OpenGL) find_package(GLEW) С этими пакетами все хорошо, они есть в самом CMake, а вот с GLFW оказалось не так просто - не find_package(GLFW) find_package(glfw3 3.3 REQUIRED) find_package(SFML COMPONENTS graphics window system) add_executable(${PROJECT_NAME} main.cpp DiamondSquare.cpp DiamondSquare.h rand-adv.h inWin3D.cpp inWin2D.cpp inFiles.cpp ViewTypes.h genImageFromMap.cpp genImageFromMap.h Camera.cpp Camera.h GLLoadShaders.h) target_link_libraries(${PROJECT_NAME} OpenGL::OpenGL GLEW::GLEW glfw sfml-graphics sfml-window sfml-system) Возможно, помимо OpenGL::OpenGL потребуются и другие модули (OpenGL::GLX, OpenGL::GLU, например). Вся прелесть таких импортируемых модулей, что не требуется заботится об target_include_directories - все ссылки на либы и пути до хедеров уже добавлены. Теперь можно сменить не только ОС, но и компилятор :). Правда сторонние либы придётся собрать под правильный компилятор.

Комментариев нет:

Отправить комментарий