Добавить библиотеки Qt и LuaJIT / Lua51 с CMake

Я пытаюсь использовать CMake с Qt и LuaJIT, который будет работать в Visual Studio 2012. Мне каким-то образом удалось запустить Qt, но я не знаю, как добавить библиотеку LuaJIT в проект. Я использую источник LuaJIT, клонированный с http://luajit.org/git/luajit-2.0.git, который создается путем запуска файла .bat.

Меня не волнует, что LuaJIT будет собран с помощью CMake, мне просто нужно связать библиотеку и добавить заголовки в проект.

Я удалил папку lib из своего проекта ... Не стоит проблем иметь зависимости в сочетании с файлом cmake проекта без: D

Моя иерархия проектов:

+lib
  -luajit-2.0
+src
  -my sources
+ui
  -ui files
-CMakeLists.txt

А файл CMakeLists.txt выглядит так:

cmake_minimum_required(VERSION 2.8.12)

set(PROJECT "Grapedit")

project(${PROJECT})

# Qt Stuff
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

find_package(Qt5Widgets REQUIRED)

set(SOURCE_FILES
  src/main.cpp
  src/mainwindow.h
  src/mainwindow.cpp
)

set(UI_FILES
  ui/mainwindow.ui
)
source_group("UI Files" FILES ${UI_FILES})

qt5_wrap_ui(UI_HEADERS ${UI_FILES})
source_group("Generated UI Headers" FILES ${UI_HEADERS})

add_executable(${PROJECT} ${SOURCE_FILES} ${UI_HEADERS} ${UI_FILES})

qt5_use_modules(${PROJECT} Widgets)

Мое решение

Наконец-то все заработало, и я сделал пару ошибок новичков ... :) Я запишу их для других:

  • не знал, что такое модуль поиска ... Это будет искать среду и настраивать местоположения библиотек или отмечать, что не нашел их. Поскольку LuaJIT совместим с Lua51, вы можете использовать find_package(Lua51).
  • Ваши библиотеки должны быть каким-то образом видимы для CMake. В Windows самый простой способ - добавить их в переменную PATH. Или вы можете добавить путь к своим библиотекам в переменную CMake CMAKE_PREFIX_PATH. Откройте модуль поиска, например FindLua51.cmake, и вы увидите, как должна быть организована ваша библиотека. В Windows я должен установить LuaJIT вручную - создать папку LuaJIT, и я поместил файлы * .h, чтобы включить подпапку, * .dll в подпапку bin и * .lib в подпапку lib. Затем добавьте папку bin в PATH и установите LUA_DIR в папку LuaJIT.
  • используйте include_directories в папке включения
  • то вы должны линковать библиотеки target_link_libraries, но после add_executable!

Мой файл CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.12)

# Declare project variables...

set (PROJECT "Grapedit")

set (
    SOURCE_FILES
    src/main.cpp
    src/mainwindow.h
    src/mainwindow.cpp
)

set(UI_FILES
    ui/mainwindow.ui
)

# Set project name
project(${PROJECT})

# Include Lua directories
include_directories(${LUA_INCLUDE_DIR})

# Qt Stuff
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

# Find packages...

# Will find also LuaJIT, but must be named same as Lua51 and installed into directories
find_package(Lua51)

# Find Qt modules, every module separately
find_package(Qt5Widgets REQUIRED)

# Create nice groups in IDEs
source_group("UI Files" FILES ${UI_FILES})
source_group("Generated UI Headers" FILES ${UI_HEADERS})

# Use Qt UI files
qt5_wrap_ui(UI_HEADERS ${UI_FILES})

# Create executable
add_executable (
    ${PROJECT} 
    ${SOURCE_FILES} 
    ${UI_HEADERS} 
    ${UI_FILES}
)

# Link libraries... 
# Must be after executable is created!

# Link Qt modules
qt5_use_modules (
    ${PROJECT} 
    Widgets
)

# Link Lua
target_link_libraries(${PROJECT} ${LUA_LIBRARIES})

# Will not show new windows prompt when running program
if (MSVC)
  set_target_properties(${PROJECT} PROPERTIES
    WIN32_EXECUTABLE YES
    LINK_FLAGS "/ENTRY:mainCRTStartup"
  )
endif ()

person AdUki    schedule 08.01.2014    source источник


Ответы (1)


Вам не хватает фактической связи, которую вы можете исправить с помощью следующего утверждения:

target_link_libraries(${PROJECT} luajit-5.1)

Конечно, было бы даже лучше, если бы этот lua jit мог иметь модуль cmake find или файл config / version в зависимости от его точной системы сборки.

Вы можете взять модуль поиска отсюда:

https://github.com/brimworks/lua-zlib/blob/master/cmake/Modules/FindLuaJIT.cmake

Тогда вы могли бы сослаться на него следующим образом:

target_link_libraries(${PROJECT} ${LUA_LIBRARIES})

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

Обратите внимание, что вам, вероятно, потребуется использовать соответствующие переменные для включения заголовка, как показано ниже:

include_directories(${LUA_INCLUDE_DIR})

Это позаботится об автоматическом поиске каталога include, соответственно, без необходимости его жесткого кодирования.

Вам также необходимо добавить следующую строку в ваш CMakeLists.txt:

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

и вам нужно поместить загруженный модуль поиска в подпапку cmake.

Пожалуйста, обратитесь к следующей странице для получения более подробной информации по этой теме в целом:

CMake: как найти библиотеки

person lpapp    schedule 09.01.2014
comment
Большое спасибо за ответ! Я добавил эти строчки set(LUA_INCLUDE_DIR "lib/luajit-2.0/src") include_directories(${LUA_INCLUDE_DIR}) и успешно включил заголовки библиотеки luaJIT :) Но до сих пор не знаю, как это связать. Так что я буду работать над этой ссылкой, которую вы мне прислали ... - person AdUki; 09.01.2014