Связывание Nanogui в Cmake в качестве внешнего проектаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Связывание Nanogui в Cmake в качестве внешнего проекта

Сообщение Anonymous »

Я хочу добавить графический интерфейс в свою программу и пытаюсь использовать Nanogui. Я адаптировал свой Cmakelists, чтобы быть похожим на другие внешние проекты, которые я уже включил. Я полагаю, что ошибка заключается в связи с связыванием библиотеки, так как я не уверен, как адаптировать конфигурации в документации к моему коду.
(#Комментарии путаницы отмечают строки, где я подозреваю, что моя ошибка лежит) < /p>
my cmakelists.txt: < /p>
####################################################################
### project setup ##################################################
####################################################################
cmake_minimum_required(VERSION 3.18 FATAL_ERROR)

# Define project and executable name
set(PROJECT_NAME MolecularSurfaces)
set(EXECUTABLE_NAME Surfaces)
project(${PROJECT_NAME} LANGUAGES CXX CUDA)

# Make sure binary directory is not the same as source directory
if(PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
message(
FATAL_ERROR
"In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there."
)
endif()

# enable unit testing via "make test" once the code has been compiled.
include(CTest)

# OpenGL
find_package(OpenGL REQUIRED)

####################################################################
### external projects ##############################################
####################################################################
# Add OpenGL, glfw, glad, glm and nanogui as external project
include(ExternalProject)

SET(CMAKE_EXE_LINKER_FLAGS /NODEFAULTLIB:\"libcmt.lib\")

set(libGLFW glfw)
ExternalProject_Add(${libGLFW}
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLFW}
GIT_REPOSITORY https://github.com/glfw/glfw.git
GIT_TAG 3.3.4
GIT_SHALLOW ON
UPDATE_DISCONNECTED 1 # Do not update the external project if it is already downloaded
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLFW}/install
-DGLFW_BUILD_DOCS:BOOL=OFF
-DGLFW_BUILD_EXAMPLES:BOOL=OFF
-DGLFW_BUILD_TESTS:BOOL=OFF
)

set(libGLAD glad)
ExternalProject_Add(${libGLAD}
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLAD}
GIT_REPOSITORY https://github.com/Dav1dde/glad.git
GIT_TAG origin/master
GIT_SHALLOW ON
UPDATE_DISCONNECTED 1 # Do not update the external project if it is already downloaded
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLAD}/install
-DGLAD_INSTALL:BOOL=ON
-DGLAD_PROFILE:STRING="core"
-DGLAD_ALL_EXTENSIONS:BOOL=ON
-DUSE_MSVC_RUNTIME_LIBRARY_DLL:BOOL=OFF
)

set(libGLM glm)
ExternalProject_Add(
glm
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/dep/glm
GIT_REPOSITORY https://github.com/g-truc/glm.git
LOG_DOWNLOAD ON
BUILD_COMMAND ""
INSTALL_COMMAND ""
UPDATE_DISCONNECTED 1 # Do not update the external project if it is already downloaded
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLM}/install
-DGLAD_INSTALL:BOOL=ON
-DGLAD_PROFILE:STRING="core"
-DGLAD_ALL_EXTENSIONS:BOOL=ON
-DUSE_MSVC_RUNTIME_LIBRARY_DLL:BOOL=OFF
)

set(GLM_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLM}/install)

set(libNANOGUI nanogui)
ExternalProject_Add(${libNANOGUI}
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/dep/nanogui
GIT_REPOSITORY https://github.com/mitsuba-renderer/nanogui.git
LOG_DOWNLOAD ON
BUILD_COMMAND ""
INSTALL_COMMAND ""
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_CURRENT_BINARY_DIR}/dep/${libNANOGUI}/src/nanogui
-DGLAD_INSTALL:BOOL=ON
-DGLAD_PROFILE:STRING="core"
-DGLAD_ALL_EXTENSIONS:BOOL=ON
-DUSE_MSVC_RUNTIME_LIBRARY_DLL:BOOL=OFF
)

# Disable building extras for the external project
#CONFUSION: I suppose these 3 lines are supposed to be added to the above ExternalProject_Add
set(NANOGUI_BUILD_EXAMPLE OFF CACHE BOOL "" FORCE)
set(NANOGUI_BUILD_PYTHON OFF CACHE BOOL "" FORCE)
set(NANOGUI_INSTALL OFF CACHE BOOL "" FORCE)

#CONFUSION: I changed the structure (nanogui is added within dep -> therefor not necessary to add subdir?)
add_subdirectory(ext/nanogui)

#CONFUSION: I have no idea how to set this property:
# a) I cannot find the dependencies necessary here
# b) I don't know how this would work with my external projects above
# For reliability of parallel build, make the NanoGUI targets dependencies
set_property(TARGET glfw glfw_objects nanogui PROPERTY FOLDER "dependencies")

# SETUP GLFW
set(GLFW_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLFW}/install)
add_library(GLFW_LIBRARY OBJECT IMPORTED)
set_target_properties(GLFW_LIBRARY PROPERTIES IMPORTED_OBJECTS ${GLFW_INSTALL_DIR}/lib/glfw3.lib)
set_property(TARGET GLFW_LIBRARY PROPERTY IMPORTED_LOCATION ${GLFW_INSTALL_DIR})

# SETUP GLAD
set(GLAD_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/dep/${libGLAD}/install)
add_library(GLAD_LIBRARY OBJECT IMPORTED)
set_target_properties(GLAD_LIBRARY PROPERTIES IMPORTED_OBJECTS ${GLAD_INSTALL_DIR}/lib/glad.lib)
set_property(TARGET GLAD_LIBRARY PROPERTY IMPORTED_LOCATION ${GLAD_INSTALL_DIR})

# SETUP nanoGUI
set(NANOGUI_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/dep/${libNANOGUI}/src/nanogui)
add_library(NANOGUI_LIBRARY OBJECT IMPORTED)
# Various preprocessor definitions generated by NanoGUI
# add_definitions(${NANOGUI_EXTRA_DEFS})

#CONFUSION: the following lines are necessary according to documentation; but I cant find the definition of ${NANOGUI_EXTRA_INCS}, ${NANOGUI_EXTRA_LIBS}
# Include directories for NanoGUI
include_directories(${NANOGUI_EXTRA_INCS})

set_property(TARGET NANOGUI_LIBRARY PROPERTY IMPORTED_LOCATION ${NANOGUI_EXTRA_LIBS})

####################################################################
### project files ##################################################
####################################################################

# list project files
# TODO when finishing project: list files explicitly as GLOB is not recommended
file(GLOB_RECURSE app CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/app/*.cu")
file(GLOB_RECURSE headers CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB_RECURSE headers CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp")
file(GLOB_RECURSE headers CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.cuh")
file(GLOB_RECURSE sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
file(GLOB_RECURSE sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c")

# Create a single .lib file containing our compiled objects, and the compiled objects of all other dependencies
add_library(${PROJECT_NAME} STATIC ${app} ${headers} ${sources})

# Add all include file paths
target_include_directories(${PROJECT_NAME}
PUBLIC ${GLAD_INSTALL_DIR}/include
PUBLIC ${GLFW_INSTALL_DIR}/include
PUBLIC ${GLM_INSTALL_DIR}/include
PUBLIC ${NANOGUI_INSTALL_DIR}/include
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/app
)

# Specify the order in which libs depend on each other
# add_dependencies(${PROJECT_NAME} ${libGLFW} ${libGLAD})
add_dependencies(${PROJECT_NAME} ${libGLFW} ${libGLAD} ${libNANOGUI})
# target_link_libraries(${PROJECT_NAME} GLAD_LIBRARY GLFW_LIBRARY)
target_link_libraries(${PROJECT_NAME} GLAD_LIBRARY GLFW_LIBRARY NANOGUI_LIBRARY)

# copy shader files
# add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
# COMMAND ${CMAKE_COMMAND} -E copy_directory
# ${CMAKE_CURRENT_SOURCE_DIR}/include/shaders
# ${CMAKE_CURRENT_BINARY_DIR}/dep/shaders
# COMMENT "Copying shaders into binary directory")

add_custom_target(copy_shaders ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/include/shaders
${CMAKE_CURRENT_BINARY_DIR}/dep/shaders
COMMENT "Copying shaders into binary directory")

add_dependencies(${PROJECT_NAME} copy_shaders)
####################################################################
### cuda configurations ############################################
####################################################################
# Request that particles be built with -std=c++17
# As this is a public compile feature anything that links to
# particles will also build with -std=c++17

target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17)
target_compile_options(${PROJECT_NAME} PRIVATE $)
target_compile_options(${PROJECT_NAME} PRIVATE $)

# Set CUDA architecture
# default value: 75 to match testing system with nvidia 2080 card

if(NOT DEFINED ${CMAKE_CUDA_ARCHITECTURES})
set(CMAKE_CUDA_ARCHITECTURES 75 CACHE STRING "CUDA architectures" FORCE)
endif()
message(STATUS "CUDA architectures set to ${CMAKE_CUDA_ARCHITECTURES}")

# We need to explicitly state that we need all CUDA files in the
# particle library to be built with -dc as the member functions
# could be called by other libraries and executables
set_target_properties( ${PROJECT_NAME}
PROPERTIES CUDA_SEPARABLE_COMPILATION ON
CUDA_RESOLVE_DEVICE_SYMBOLS ON
)

# add executable
add_executable(${EXECUTABLE_NAME} app/main.cu)

target_include_directories(${EXECUTABLE_NAME}
PUBLIC ${GLAD_INSTALL_DIR}/include
PUBLIC ${GLFW_INSTALL_DIR}/include
PUBLIC ${GLM_INSTALL_DIR}/include
PUBLIC ${NANOGUI_INSTALL_DIR}/include
PUBLIC ${GLAD_C_DIR}
)

set_property(TARGET ${EXECUTABLE_NAME}
PROPERTY CUDA_SEPARABLE_COMPILATION ON
CUDA_RESOLVE_DEVICE_SYMBOLS ON
)
target_link_libraries(${EXECUTABLE_NAME} ${PROJECT_NAME})
< /code>
Вот одна строка ошибок в качестве примера: < /p>
[build] main.obj : error LNK2019: unresolved external symbol "public: void __cdecl nanogui::Object::inc_ref(void)const " (?inc_ref@Object@nanogui@@QEBAXXZ) referenced in function "public: __cdecl nanogui::ref::ref(class nanogui::Screen *)" (??0?$ref@VScreen@nanogui@@@nanogui@@QEAA@PEAVScreen@1@@Z)
< /code>
Я проверил все пути для Nanogui (включать DIR и т. Д.), Чтобы убедиться, что файлы заголовков в моем коде можно найти (и их можно найти). Как только я их использую (создавать элементы графического интерфейса и рисовать), ошибки начинают появляться.

Подробнее здесь: https://stackoverflow.com/questions/783 ... al-project
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»