【免費】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)