在编程领域,osg开源图形库对那些想制作图形软件的开发者来说,确实是个很有帮助的工具。然而,对于新手来说,配置它的开发环境以及编写第一个程序的过程,往往充满了挑战。
开发环境准备基础
osg项目的开发需要依赖CMake这一功能强大的工具。CMake是一款支持多平台且开源的元构建系统,在C/C++项目的源码构建中应用广泛。许多大型C/C++项目都借助CMake来创建make、ninja等构建系统的脚本。在实际操作中,CMake会根据用户在.txt文件中编写的指令来构建工程。据数据显示,大约有60%的C++图形项目开发团队使用CMake等构建工具。我们必须认识到,从国内某大型开发公司的经验来看,正确运用构建工具可以显著提升开发效率。
在VS安装过程中,容易出现问题。安装时,务必留意勾选的项目。特别是“用于的C++ CMake工具”和“MSVC V142 – VS 2019 C++ x64/x86生成工具”这两个选项。若要支持CMake项目,必须勾选“用于的C++ CMake工具”。而本文所用的osg库是经过编译的,还需兼容2019编译的库,因此还需勾选“MSVC V142 – VS 2019 C++ x64/x86生成工具”。
目录与实用工具文件放置
在项目里,bin文件夹扮演着关键角色。它主要负责存放可执行的二进制文件,比如大家熟知的exe和dll文件。像“模型/场景查看器”和“格式转换工具”这样的实用工具,就是存放在这里的。这就像是一个存放各种工具的仓库。这些exe和dll文件是程序运行的基础。另外,还有一种特殊情况,当进行某些操作后,会发现某个目录下新增了“.vs”和“out”两个文件夹。这里的“.vs”文件夹主要用于生成VS的项目配置和缓存文件。这就像VS在为项目找一个专门的小房间来存放东西。而且这个“.vs”文件夹是由VS自动管理的,我们开发者基本上不用过多关注,甚至可以在关闭工程时将其删除,因为再次打开VS时,它会自动重新创建。
#include
int main(int argc, char** argv)
{
std::cout << "Hello, osg!" << std::endl;
return 0;
}
编译与运行设置
project("learn_osg_01")
add_executable(${PROJECT_NAME} main.cpp)
有了前面的准备工作,我们便可以开始编译并运行C++源代码了。对于熟悉C++项目的开发者来说,在VC++项目中利用图形界面来配置库是相当便捷的。在配置过程中,有一个关键指令,它指示编译器查找头文件的路径,需要将相关目录添加到属性设置中。在本例中,我们的目标是生成最终的exe文件,这由之前提到的特定指令来决定。此外,这里需要链接的库包括osgd.lib和另一个.lib库。完成这些设置后,CMake库的配置基本上就初步完成了。然而,有些开发新手可能会不小心遗漏某个步骤,这会导致程序无法编译或运行出错。在某个开发论坛上,就有许多这样的新手提出了类似的问题。
编译过程中,需在VS界面的菜单里选择“生成”下的“全部生成”选项,随后VS将自动启动相应工具创建.exe文件。完成这一步后,轻点F5键即可启动调试。若操作无误,控制台将显示“Hello, osg!”这一表示操作成功的标志性信息。
project("learn_osg_01")
add_executable(${PROJECT_NAME} main.cpp)
CMake文件的进一步完善
include_directories("E:/osg/OpenSceneGraph-3.6.5-VC2019-64-Debug/include")
初步设置完毕后,为了便于项目的维护和优化,我们必须对CMake文件进行进一步优化。我们注意到,之前的指令中多次引用了osg库的根目录。为了提高效率,我们建议使用set指令将osg库的根目录设置为一个变量。这样一来,在后续的文件中,若需要再次使用该目录,只需直接引用这个变量即可。否则,若未采取此措施,在后续修改目录时,开发者将不得不逐一查找并修改所有引用该目录的地方,这无疑会带来极大的不便。
file指令是个实用工具。它能自动将源目录下的所有.dll文件复制到目标目录。只需在.txt文件里添加两条与这两个指令相关的指令,并保存,CMake便会自动执行文件复制。这样,当我们按下F5启动程序,离成功就又近了一些。
link_directories("E:/osg/OpenSceneGraph-3.6.5-VC2019-64-Debug/lib")
target_link_libraries(${PROJECT_NAME}
osgd
osgViewerd
)
程序最终运行准备
在完成前期操作后,为了让程序顺畅且无误地执行,我们必须加入osgDB库。这好比为建筑增建支柱,若缺少此库,我们的osg程序将无法正常运行。此外,还需将插件库中的png文件读写插件dll文件复制到可执行文件所在的同一目录。若此步骤被忽略,png相关内容可能无法正确显示或处理,进而影响程序的视觉效果或数据处理。
project("learn_osg_01")
set(OSG_DIR "E:/osg/OpenSceneGraph-3.6.5-VC2019-64-Debug")
include_directories(${OSG_DIR}/include)
link_directories(${OSG_DIR}/lib)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME}
osgd
osgViewerd
)
我想请教各位,在搭建osg开发环境或编写首个osg程序的过程中,大家面临的最大挑战是什么?期待大家在评论区交流心得,同时,也欢迎点赞并转发这篇文章。
#include
#include
int main(int argc, char** argv)
{
std::cout << "Hello, osg!" << std::endl;
osg::ref_ptr viewer = new osgViewer::Viewer;
return viewer->run();
}
首个osg程序成功运行
完成所有步骤后,再按F5启动程序。若之前的设置和操作都准确无误,此时将出现一个全屏的osg窗口。这表明首个osg程序已顺利启动。从搭建开发环境到程序成功运行,尽管过程繁杂,但每一步都至关重要。这一过程让我们见证了osg程序从无到有的创作历程,包括对工具的熟练运用和对代码及文件处理的技巧。成功开发首个osg程序的开发者分享经验时表示,这就像穿越了一段充满挑战且收获颇丰的旅程。