【免费】osgQOpenGLWidget嵌入qt模块,VS2022使用cmake的方式,工具链vcpkg资源-CSDN下载
CMake中设置
1.查找osg相关的库,同时也会设置对应include的路径
# 检查是否找到 osg
find_package(OpenSceneGraph 3.6.5REQUIRED COMPONENTS osgosgUtilosgGAosgViewerosgDBosgAnimationosgManipulatorosgParticleosgPresentationosgShadowosgSimosgTerrainosgTextosgVolumeosgWidget#osgUIosgQt
)
if(OpenSceneGraph_FOUND)#message(STATUS "Found osg lib: ${OPENSCENEGRAPH_LIBRARIES}")#message(OSGDB_FOUND=${OSGDB_FOUND}, ${OSGDB_INCLUDE_DIR}, ${OSGDB_LIBRARY})#message(OSGGA_FOUND=${OSGGA_FOUND}, ${OSGGA_INCLUDE_DIR}, ${OSGDA_LIBRARY})#message(OSGQT_FOUND=${OSGQT_FOUND}, ${OSGQT_INCLUDE_DIR}, ${OSGQT_LIBRARY})message(OPENSCENEGRAPH_FOUND=${OPENSCENEGRAPH_FOUND}, ${OPENSCENEGRAPH_INCLUDE_DIR}, ${OPENSCENEGRAPH_LIBRARIES})
else()message(FATAL_ERROR "osg not found!")
endif()
为了保证这个头文件#include <osgQOpenGL/osgQOpenGLWidget> 能正常,还得在cmake中重新包含一下,不知道为什么???
2.重新将vcpkg的头文件在设置一遍
#获取vcpkg的路径
set(VCPKG_PATH1 "$ENV{VCPKG_PATH}/installed/x64-windows/include") #设置使用vcpkg的路径include_directories(${VCPKG_PATH1})
3.链接lib库
target_link_libraries(${DemoName} PRIVATE${OPENSCENEGRAPH_LIBRARIES}
)
4.添加osg插件到对应exe同路径下(没有插件dll,osgDB::readNodeFile指令读取文件时就会为NULL了,却不报缺少的dll插件,通过调试源码发现(这也是为什么在vcpkg中的bebug文件中的pdb文件不要轻易删掉,在需要调试源码时,这个就派上用场了),底层依赖插件的dll.也可以直接将整个osgPlugins-3.6.5自己手动复制过去,或者将该路径设置到系统环境变量中,这也是有些文章提到的设置方法.根本的东西就是整个插件dll要在正确的位置)
qt的插件的模块vcpkg会自动根据cmake配置来加载进去,osg的好像得手动添加入.
#将osg的插件文件复制到对应的调试文件夹中
#根据对应lib文件的路径.同路径下的plugins文件中的osgPlugins-3.6.5文件夹中的dll文件都复制过去# 判断生成的是debug还是release版本,根据 CMAKE_BUILD_TYPE 选择库if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")set(OSG_PLUGINS_DIR "$ENV{VCPKG_PATH}/installed/x64-windows/debug/plugins/osgPlugins-3.6.5")
elseif(${CMAKE_BUILD_TYPE} STREQUAL "Release")set(OSG_PLUGINS_DIR "$ENV{VCPKG_PATH}/installed/x64-windows/plugins/osgPlugins-3.6.5")
else()message(FATAL_ERROR "Unknown build type: ${CMAKE_BUILD_TYPE}")
endif()#遍历osg插件文件夹中的dll
# 遍历DLL文件
file(GLOB_RECURSE OSG_PLUGIN_FILES"${OSG_PLUGINS_DIR}/*.dll"
)#创建osgPlugins-3.6.5文件夹
add_custom_command(TARGET ${DemoName} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:${DemoName}>/osgPlugins-3.6.5"COMMENT "creat file: $<TARGET_FILE_DIR:${DemoName}>/osgPlugins-3.6.5"
)# 复制到对应文件夹中
foreach(OSG_PLUGIN_FILE IN LISTS OSG_PLUGIN_FILES)add_custom_command(TARGET ${DemoName} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy"${OSG_PLUGIN_FILE}""$<TARGET_FILE_DIR:${DemoName}>/osgPlugins-3.6.5"COMMENT "Copying ${OSG_PLUGIN_FILES} to $<TARGET_FILE_DIR:${DemoName}>/osgPlugins-3.6.5")
endforeach()
5.将osgQt的查找模块文件改为osgQOpenGL
在osg3.6.5中,osgQt已经分离为单独的子项目,其146版本使用了QOpenGL,其使用的头文件与生成的库与旧版osgQt相比,都发生了变化。需要对findosgqt.cmake文件进行修改,才能正常使用find_package(osgQt)或find_package(OpenSceneGraph 3.6.5 REQUIRE osgQt)。
参考文章:
使用CMake查找osgQt_qt项目cmakelist怎么找osg库-CSDN博客
C:\Program Files\CMake\share\cmake-4.0\Modules中找到FindosgQt.cmake ,根据cmake版本来查找
``OSGQT_LIBRARY_DEBUG``The osgQt debug library``$OSGDIR`` is an environment variable that would correspond to::./configure --prefix=$OSGDIRused in building osg.Created by Eric Wing. Modified to work with osgQt by Robert Osfield,
January 2012.
#]=======================================================================]# Header files are presumed to be included like
# #include <osg/PositionAttitudeTransform>
# #include <osgQt/GraphicsWindowQt>include(${CMAKE_CURRENT_LIST_DIR}/Findosg_functions.cmake)
#OSG_FIND_PATH (OSGQT osgQt/GraphicsWindowQt)
#OSG_FIND_LIBRARY(OSGQT osgQt)
#20250914
OSG_FIND_PATH (OSGQT osgQOpenGL/osgQOpenGLWidget)
OSG_FIND_LIBRARY(OSGQT osgQOpenGL)include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(osgQt DEFAULT_MSGOSGQT_LIBRARY OSGQT_INCLUDE_DIR)