首先这不是一篇提供一个简单的方案的文章,文章会深入的解释为什么会出现这些情况,以让读可以应万变。

网络上提供比如类似的方案无法打开输入文件optimized.lib osgEarth2.8… 可能能够帮你正好的解决你这个问题,但是也可能解决不了,因为它只针对一种情况。

现象

之所以出现无法打开optimized.lib原因是CMAKE根据脚本对工程的依赖中有optimized.lib,不仅如此,比如我们使用osgEarth2.8的代码,直接cmake,会发现osgEarthFeatures工程的依赖是这样:

11g dba_priv_audit_opts中没有create session选项原因_openscenegraph


上述错误不但出现了optimized.lib debug.lib还把同一个库的debug和release都包进去了

11g dba_priv_audit_opts中没有create session选项原因_cmake_02


同样下面的zlib也出现了都包进去的现象。

原因

11g dba_priv_audit_opts中没有create session选项原因_osg_03


对于protobuf和zlib库来说,他们有_DEBUG和_RELEASE的后缀,对于其它库来说,比如OSGVIEWER来说,只有_DEBUG,而RELEASE则默认是OSGVIEWER_LIBRARY

在CMAKE的脚本中针对同时有_DEBUG和_RELEASE的情况的判断不那么好,参见类似目录osgearth-osgearth-2.8\CMakeModules\OsgEarthMacroUtils.cmake:

其中的关键宏如下:

11g dba_priv_audit_opts中没有create session选项原因_openscenegraph_04


其中红色的代码是我新增的,原版的没有红色的代码,可以看到原版的代码没有针对同时定义了_DEBUG和_RELEASE的判断,原版逻辑是:

如果定义了_DEBUG,则就链接KaTeX parse error: Expected '}', got 'EOF' at end of input: {{varname}},这个串是一个即包含DEBUG也包含RELEASE的串如下:

11g dba_priv_audit_opts中没有create session选项原因_openscenegraph_05


而其它的库因为没有同时定义_DEBUG和_RELEASE,所以是正确的。

修改的逻辑也非常简单,如上上图不再缀述。

还有要注意的

CMAKE的命令是不区分大小写的,但是CMAKE的变量区分大小写,比如对于FindProtobuf.cmake而言,它把变量从小写变成了大小,以示统一都用大写,来适应其它脚本,但是它漏了_RELEASE版本的变量,这样也会导致系统认为没有_RELEASE,而上面说的脚本执行错误,下图就是FindProtobuf.cmake的截图,所有后缀是_RELEASE的变量都是我加进去的:

11g dba_priv_audit_opts中没有create session选项原因_后缀_06


另外就是如果你更改了cmake下的脚本,这显然并不科学,正确的是你要在自己的工程里有对应脚本,这样代码拷到哪里都可以,你可以把CMAKE安装目录下的Find脚本拷到你的源码的对应目录下,但是要注意将里面的参考路径修改掉,否则会报找不到对应脚本,如下:

11g dba_priv_audit_opts中没有create session选项原因_openscenegraph_07


右侧的是CMAKE安装路径下的FIND脚本,它从当前路径下寻找SelectLibraryConfigurations.cmake,但是因为我们已经把FIND脚本拷到我们的源码路径下,而源码路径下并没有SelectLibraryConfigurations.cmake,因此也会报错如下:

11g dba_priv_audit_opts中没有create session选项原因_osg_08