|
楼主 |
发表于 2009-3-15 14:40:14
|
显示全部楼层
1.5 VersionMe工程设计
下面我们将着手设计一个稍微复杂一些的工程,名为VersionMe。它同样包括一个动态链接库工程和一个依赖于它的可执行工程,并且计划实现以下一些功能:
- 可以查询当前操作系统的版本;
- 可以查询系统中安装的OpenSceneGraph库的版本;
- 可以执行上一次我们创建的HelloWorld工程的方法;
为了使我们的工程更具备开源工程的特征,我们模仿OpenSceneGraph的文件夹结构,设计如下:
名为VersionLib的链接库工程的头文件和源代码文件将分别保存到include和src两个目录下;而名为test的可执行工程则单独保存在同名目录下;此外,CMakeModules目录专职负责保存相关的CMake脚本数据。
这个工程的重点毫无疑问是VersionLib链接库,它的工作是提供显示系统版本和OSG版本的函数,以及调用之前的Hello::sayHello方法,再次在控制台界面上显示“Hello CMake!”这一行简单而友好的欢迎文字。
VersionLib库包括一个头文件Version和一个源代码文件Version.cpp,其代码如下:- /* Version */
- #ifndef H_VERSION
- #define H_VERSION
- #if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__)
- # ifdef VERSIONME_LIBRARY
- # define VERSIONME_EXPORT __declspec(dllexport)
- # else
- # define VERSIONME_EXPORT __declspec(dllimport)
- # endif
- #else
- # define VERSIONME_EXPORT
- #endif
- class VERSIONME_EXPORT Version
- {
- public:
- void printHello();
- const char* systemVersion();
- const char* osgVersion();
- };
- #endif
- /* Version.cpp */
- #ifdef _MSC_VER
- # include <windows.h>
- #else
- # include <sys/utsname.h>
- #endif
- #include <sstream>
- #include <HelloLib/Hello>
- #include <osg/Version>
- #include <VersionLib/Version>
- static char g_version[255] = "";
- void Version::printHello()
- {
- Hello hello;
- hello.sayHello();
- }
- const char* Version::systemVersion()
- {
- std::stringstream stream;
- #ifdef _MSC_VER
- OSVERSIONINFO osvi;
- ZeroMemory( &osvi, sizeof(OSVERSIONINFO) );
- osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
- GetVersionEx( &osvi );
- stream << "Windows-";
- stream << osvi.dwMajorVersion << "." << osvi.dwMinorVersion << "."
- << osvi.dwBuildNumber;
- #else
- struct utsname buff;
- uname( &buff );
- stream << buff.sysname << "-" << buff.release;
- #endif
- stream >> g_version;
- return g_version;
- }
- const char* Version::osgVersion()
- {
- return osgGetVersion();
- }
复制代码 具体的实现过程我们不作介绍,这里的osgGetVersion()是OSG的版本查询函数,而GetVersionEx()和uname则分别是Windows和Linux下的版本查询API函数。嗯,是否觉得这里Windows API的实现更加费劲呢?(^_^)
此外,这里我们引用头文件Hello并调用了其中的函数,因此在之后的CMake脚本设计过程中,要考虑正确搜索和指定Hello头文件依赖目录以及依赖库的路径位置。
而Test工程的源代码就很简单了,只有一个test.cpp文件,内容如下:- /* test.cpp */
- #include <iostream>
- #include <VersionLib/Version>
- int main( int argc, char** argv )
- {
- Version obj;
- std::cout << "Operating System Version: " << obj.systemVersion() << std::endl;
- std::cout << "OpenSceneGraph Version: " << obj.osgVersion() << std::endl;
- obj.printHello();
- return 0;
- }
复制代码 我们希望在CMake-GUI窗口中有一个用户选项,用来决定是否编译这个Test工程。另外,我们还希望能够使用类似“make install”这样的命令来安装所有工程相关的动态库,静态库,头文件和可执行文件。(之前的HelloWorld工程是无法这样做的)
以上就是VersionMe工程设计的所有要求。下面,我们将开始CMake脚本的设计。 |
|