Я пытаюсь сделать простой просмотрщик сетки с помощью OpenSceneGraph, и я хочу использовать Conan для зависимостей. Компиляция хорошо работает как в режиме отладки, так и в режиме выпуска (сейчас я компилирую в Windows с помощью инструментария msvc).

Как только я пытаюсь загрузить какую-либо сетку, osgDB :: readNodeFiles просто терпит неудачу. Похоже, плагин не связан с финальным двоичным файлом. Я проверил пакет Конана, список плагинов .lib существует и, как я полагаю, должен быть связан. Что я мог пропустить?

Вот мой файл conanfile.txt:

[requires]
    openscenegraph/3.6.5
[generators]
cmake

CMakeLists.txt также прост:

cmake_minimum_required(VERSION 3.17)

# Set a default build type if none was specified
set(default_build_type "Release")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
    set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
            STRING "Choose the type of build." FORCE)
    # Set the possible values of build type for cmake-gui
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
            "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()

set(PROJECT_NAME 3D_radio)

project(${PROJECT_NAME})

if(EXISTS ${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
    include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
    conan_basic_setup()
    set(CMAKE_CONFIGURATION_TYPES ${CONAN_CONFIGURATION_TYPES})
else()
    message(WARNING "The file conanbuildinfo.cmake doesn't exist, you have to run conan install first")
endif()

# get all source files
file(GLOB all_SRCS
        "include/*.h"
        "source/*.cpp"
        )

# add executable and addShader libraries
add_executable(${PROJECT_NAME} ${all_SRCS} source/main.cpp include/main.h)

target_include_directories(${PROJECT_NAME} PRIVATE
        include
        ${CONAN_INCLUDE_DIRS}
        )

target_link_libraries(${PROJECT_NAME} ${CONAN_LIBS})

И код тоже очень простой:

int main(int argc, char **argv) {
    // use an ArgumentParser object to manage the program arguments.
    osg::ArgumentParser arguments(&argc,argv);

    // read the scene from the list of file specified commandline args.
    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);

    // if not loaded assume no arguments passed in, try use default mode instead.
    if (!loadedModel) loadedModel = osgDB::readNodeFile("cow.osgt");

    // if no model has been successfully loaded report failure.
    if (!loadedModel)
    {
        std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
        return 1;
    }
}

Вывод консоли:

C:\...\cmake-build-release\bin\program.exe C:\...\first.obj
C:\...\cmake-build-release\bin\program.exe: No data loaded
Error reading file C:\...\first.obj: read error (Could not find plugin to read objects from file "C:\...\first.obj".)
Error reading file cow.osgt: read error (Could not find plugin to read objects from file "cow.osgt".)

Например, у меня нет проблем с открытием этих файлов в Paint 3D. Так что я знаю, что они правы. Проблема, похоже, исходит от ссылки. Любая идея ?

0
Erwan Daniel 24 Фев 2021 в 21:43

1 ответ

Лучший ответ

Я нашел решение. Я компилирую программу статически, плагины связаны с финальным двоичным файлом, но реестр плагинов ищет динамическую библиотеку (например, osgdb_obj.dll).

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

USE_OSGPLUGIN(obj)
USE_GRAPHICSWINDOW() // and you may want this to get a window
0
Erwan Daniel 1 Мар 2021 в 09:19