【发布时间】:2018-04-20 20:49:39
【问题描述】:
我面临着奇怪的情况。我的引擎应该调用另一个库的某些功能。问题是如果我在系统中有错误(不兼容)的库包版本,引擎将停止工作,没有任何异常或 Linux 信号。基本上,引擎将基本的 Linux 信号处理为分段错误等。这些信号不会出现。我的程序看起来像:
try {
interface->somefunctioncall(...);
} catch(...) {
;
}
interface->somefunctioncall(...) 是从另一个包调用另一个共享库。如果包有错误的版本,这个调用将导致引擎崩溃,Linux 系统中将没有关于它的信息。我只想以某种方式处理这种情况并将一些信息存储到日志中。不管会发生什么。引擎可能会崩溃。但我想在日志中存储引擎崩溃的原因。 另一个很好的提示可能是,如果我可以在运行时处理这种情况并且引擎可以继续。 确保我在嵌入式 Linux 上进行开发,使用第三方软件的可能性有限。 请不要提示:
if (packageversion != expectedversion) {
do_not_do_call_and_log_the_problem();
} else {
interface->somefunctioncall(...);
}
非常感谢您的提示。 :-)
【问题讨论】:
-
为什么不能接受类似于
if (packageversion != expectedversion) {的解决方案? - 似乎是显而易见的解决方案.. -
确保链接到您需要的库版本,包括主要和次要版本号。 (通常第三个数字,如果有的话,用于不破坏兼容性的错误修复。)您甚至可能需要自己包含一个副本作为应用程序的一部分,但如果它可以从包管理器中获得,您应该只是能够将特定版本列为依赖项。
-
或者你能静态链接那个库吗?
-
Solution if (packageversion != expectedversion) 对我来说是不可接受的,因为我有 1.000.000 个版本和 1.000.000 个版本的包。项目中的每个人都可以更改任何库中的某些内容,并且无法查看和处理所有这些更改。
-
我不能静态链接它,因为我不是包的所有者。我对包和项目没有任何控制权。这不是一个好的解决方案。我会遇到很多构建问题。
标签: c++ linux shared-libraries embedded-linux