第41节 osg和osgEarth编译中的找不到optimized.lib和debug.lib的问题

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

网络上提供比如类似的方案无法打开输入文件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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值