无法定位程序输入点到_ftol2于动态链接库msvcrt.dll的错误的解决

本文介绍了解决因MSVCRT.DLL链接错误导致程序在Windows XP上无法正常运行的问题。错误源于程序或其底层库链接了不兼容版本的MSVCRT.DLL。通过删除特定DLL文件并确保加载正确版本的DLL来解决此问题。

作者:朱金灿

来源:http://blog.youkuaiyun.com/clever101

 

           今天同事在Windows XP系统上运行程序遇到这样一个错误:


       我试了一下,在Win7上运行则没有这个错误。只是程序运行出错,代码编译是没有问题的。初步分析了一下,大致明白了问题了根源。问题的根源在于程序的exe或者其底层库链接了一个错误的msvcrt.dll。其实微软提供的VC运行时库是有很多版本的。为什么需要这么多的运行时库?原因很多,主要有下面两个:一是为了不同的处理器厂商和硬件架构,比如amd和intel,比如x86和x64等等;二是为了适配不同VS版本,比如VS2003、VS2005、VS2008等等,即使同是VS2008,VS2008和VS2008+sp1的运行时库都是不一样的。因此msvcrt.dll在xp系统和win7系统都是不一样的,具体到这个错误是_ftol2函数在xp系统和win7系统所处的函数地址是不一样的。


      如上所述,要解决这个错误就必须找到到底哪个底层库链接了错误的msvcrt.dll。这次我采用的一个笨办法是使用depends打开exe程序,然后一个个地查找其依赖库,最后找到一个opengl32.dll,其视图如下:

       从上图可以看出opengl32.dll所依赖的msvcrt.dll呈现红色警告,可以看出opengl32.dll所链接的msvcrt.dll并不对。后来我检查了一下,exe所在目录下有opengl32.dll,把它删掉后程序所用的应该是操作系统目录下的opengl32.dll,这样程序能顺利启动了。

 

       单纯靠depends打开exe程序分析它的依赖库是否存在错误链接的问题这种做法效率无疑有点低,特点是当一个程序的依赖库特别多的时候。我想到的一个可以提高效率的做法是写一个程序通过获取exe的依赖库表,然后逐个进行动态加载(即调用LoadLibrary函数),一旦加载时出现无法定位程序输入点的错误,即可判断该库存在链接的错误。

以下代码是涉及到贝叶斯更新的一段代码,但目前的瓶颈是精度仍然较低,请你提供提高精度的措施。 def update(self, active_parameters): if len(self.observation_data['depths']) == 0: return self.posterior_distributions if not active_parameters: return self.posterior_distributions if not hasattr(self, 'parameter_history'): self.parameter_history = {param: [] for param in self.prior_distributions.keys()} if not hasattr(self, 'gradient_history'): self.gradient_history = {param: [] for param in self.prior_distributions.keys()} max_attempts = 3 attempt = 0 success = False while attempt < max_attempts and not success: bounds = [ (self.prior_distributions[param]['min'], self.prior_distributions[param]['max']) for param in active_parameters ] result = differential_evolution( self.likelihood, bounds=bounds, args=(active_parameters,), strategy='best1bin', maxiter=15, popsize=8, tol=10, mutation=(0.5, 1), recombination=0.7, workers=-1, disp=False, polish=False, ) if result.success: print('--------------------------------------------------------------------------') result_lbfgs = minimize( self.likelihood, result.x, args=(active_parameters,), method='L-BFGS-B', bounds=bounds, options={'maxiter': 150, 'ftol': 1e-6} ) if result_lbfgs.success: best_params = result_lbfgs.x success = True else: best_params = result.x else: best_params = result.x if result.success: for idx, param in enumerate(active_parameters): prev = self.optimal_parameters[param] new = best_params[idx] alpha = 0.5 self.optimal_parameters[param] = alpha * new + (1 - alpha) * prev soil_data_opt = update_soil_data_with_posterior(self.soil_data_template, self.optimal_parameters) eta_opt = update_eta_with_posterior(self.optimal_parameters) parameters_model_opt = get_parameters(soil_data_opt, eta_opt) # print(f'parameters_model_opt: {parameters_model_opt}') result_opt = self.model(exist_info=self.exist_info, parameters=parameters_model_opt, **self.model_args) if result_opt is None: for param in active_parameters: current_min = self.posterior_distributions[param]['min'] current_max = self.posterior_distributions[param]['max'] initial_min = self.initial_ranges[param][0] initial_max = self.initial_ranges[param][1] range_width = (current_max - current_min) new_range_width = min(initial_max - initial_min, 1.25 * range_width) new_min = max(initial_min, self.optimal_parameters[param] - new_range_width / 2) new_max = min(initial_max, self.optimal_parameters[param] + new_range_width / 2) self.posterior_distributions[param] = {'min': new_min, 'max': new_max} self.prior_distributions = self.posterior_distributions.copy() attempt += 1 continue Tip_depth_pred_opt, Q_vertical_pred_opt = result_opt capacities_pred_opt = np.interp(self.observation_data['depths'], Tip_depth_pred_opt, Q_vertical_pred_opt) observed_capacities = np.array(self.observation_data['bearing_capacities']) max_observed = np.max(observed_capacities) if np.max(observed_capacities) != 0 else 1 max_predicted = np.max(capacities_pred_opt) if np.max(capacities_pred_opt) != 0 else 1 max_ = max(max_observed, max_predicted) capacities_pred_opt_norm = capacities_pred_opt / max_ capacities_obs_norm = observed_capacities / max_ residuals_opt = capacities_obs_norm - capacities_pred_opt_norm depths = np.array(self.observation_data['depths']) weights = self.compute_constrained_weights(depths) if np.sum(weights) == 0: weights = np.ones_like(depths) residual_std = np.sqrt(np.average((residuals_opt) ** 2, weights=weights / np.sum(weights))) capacities_obs_std = np.std(capacities_obs_norm) if residual_std <= self.residual_threshold * capacities_obs_std: for param in active_parameters: current_min = self.posterior_distributions[param]['min'] current_max = self.posterior_distributions[param]['max'] range_width = (current_max - current_min) new_range_width = max(self.min_range_widths[param], 0.75 * range_width) new_min = max(self.initial_ranges[param][0], self.optimal_parameters[param] - new_range_width / 2) new_max = min(self.initial_ranges[param][1], self.optimal_parameters[param] + new_range_width / 2) self.posterior_distributions[param] = {'min': new_min, 'max': new_max} else: for param in active_parameters: current_min = self.posterior_distributions[param]['min'] current_max = self.posterior_distributions[param]['max'] initial_min = self.initial_ranges[param][0] initial_max = self.initial_ranges[param][1] if current_min <= initial_min and current_max >= initial_max: continue range_width = (current_max - current_min) new_range_width = min(initial_max - initial_min, 1.25 * range_width) new_min = max(initial_min, self.optimal_parameters[param] - new_range_width / 2) new_max = min(initial_max, self.optimal_parameters[param] + new_range_width / 2) self.posterior_distributions[param] = {'min': new_min, 'max': new_max} self.prior_distributions = self.posterior_distributions.copy() success = True else: for param in active_parameters: current_min = self.posterior_distributions[param]['min'] current_max = self.posterior_distributions[param]['max'] initial_min = self.initial_ranges[param][0] initial_max = self.initial_ranges[param][1] if current_min <= initial_min and current_max >= initial_max: continue range_width = (current_max - current_min) new_range_width = min(initial_max - initial_min, 1.25 * range_width) new_min = max(initial_min, self.optimal_parameters[param] - new_range_width / 2) new_max = min(initial_max, self.optimal_parameters[param] + new_range_width / 2) self.posterior_distributions[param] = {'min': new_min, 'max': new_max} self.prior_distributions = self.posterior_distributions.copy() attempt += 1 # print(self.posterior_distributions) new_eta = self.optimal_parameters['eta'] self.exist_info['d'].append(self.observation_data['depths'][-1]) self.exist_info['eta'].append(new_eta) return self.posterior_distributions
07-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值