#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 - все ссылки на либы и пути до хедеров уже добавлены. Теперь можно сменить не только ОС, но и компилятор :). Правда сторонние либы придётся собрать под правильный компилятор.
Комментариев нет:
Отправить комментарий