首先这不是一篇提供一个简单的方案的文章,文章会深入的解释为什么会出现这些情况,以让读可以应万变。
网络上提供比如类似的方案无法打开输入文件optimized.lib osgEarth2.8… 可能能够帮你正好的解决你这个问题,但是也可能解决不了,因为它只针对一种情况。
现象
之所以出现无法打开optimized.lib原因是CMAKE根据脚本对工程的依赖中有optimized.lib,不仅如此,比如我们使用osgEarth2.8的代码,直接cmake,会发现osgEarthFeatures工程的依赖是这样: 上述错误不但出现了optimized.lib debug.lib还把同一个库的debug和release都包进去了 同样下面的zlib也出现了都包进去的现象。
原因
对于protobuf和zlib库来说,他们有_DEBUG和_RELEASE的后缀,对于其它库来说,比如OSGVIEWER来说,只有_DEBUG,而RELEASE则默认是OSGVIEWER_LIBRARY
在CMAKE的脚本中针对同时有_DEBUG和_RELEASE的情况的判断不那么好,参见类似目录osgearth-osgearth-2.8\CMakeModules\OsgEarthMacroUtils.cmake:
其中的关键宏如下: 其中红色的代码是我新增的,原版的没有红色的代码,可以看到原版的代码没有针对同时定义了_DEBUG和_RELEASE的判断,原版逻辑是: 如果定义了_DEBUG,则就链接KaTeX parse error: Expected '}', got 'EOF' at end of input: {{varname}},这个串是一个即包含DEBUG也包含RELEASE的串如下: 而其它的库因为没有同时定义_DEBUG和_RELEASE,所以是正确的。 修改的逻辑也非常简单,如上上图不再缀述。
还有要注意的
CMAKE的命令是不区分大小写的,但是CMAKE的变量区分大小写,比如对于FindProtobuf.cmake而言,它把变量从小写变成了大小,以示统一都用大写,来适应其它脚本,但是它漏了_RELEASE版本的变量,这样也会导致系统认为没有_RELEASE,而上面说的脚本执行错误,下图就是FindProtobuf.cmake的截图,所有后缀是_RELEASE的变量都是我加进去的: 另外就是如果你更改了cmake下的脚本,这显然并不科学,正确的是你要在自己的工程里有对应脚本,这样代码拷到哪里都可以,你可以把CMAKE安装目录下的Find脚本拷到你的源码的对应目录下,但是要注意将里面的参考路径修改掉,否则会报找不到对应脚本,如下: 右侧的是CMAKE安装路径下的FIND脚本,它从当前路径下寻找SelectLibraryConfigurations.cmake,但是因为我们已经把FIND脚本拷到我们的源码路径下,而源码路径下并没有SelectLibraryConfigurations.cmake,因此也会报错如下: 如果看完了你还不知道怎么办,可以联系我:微信13324598743
|