Я хочу добавить графический интерфейс в свою программу и пытаюсь использовать 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
Связывание Nanogui в Cmake в качестве внешнего проекта ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Связывание math.h через CMake при добавлении внешнего проекта, отличного от CMake
Anonymous » » в форуме C++ - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-