关于hms_profinet demo 接口封装以及迁移到集成自己工程遇到的问题总结

本文详细描述了在Qt工程中遇到的动态库与静态库使用问题,包括异常退出、链接错误以及头文件找不到的问题。通过分析和解决这些问题,总结了解决动态库和静态库在不同环境下的兼容性以及CMakeLists.txt配置的注意事项,为Qt工程的库集成提供了参考。
摘要由CSDN通过智能技术生成

项目场景:

客户给了一个hmspfofinet demo ,需要对其再次封装成一个库,集成到自己工程上

问题描述及分析:

问题1.客户demo迁移至qt工程,使用cmake生成动态库linhmsprofinet.dll,在其它工程使用此动态库linhmsprofinet.dll,会导致其它工程异常退出,甚至进入不了mian 函数,报’'exited with code -123387763"

原因分析:
可能生成的动态库有问题,后来生成静态库linhmsprofinet.a在别的工程上能正常使用。另外,在windows环境上自己简单生成某个动态库libMyPath.dll,在别的工程上使用,也会出现这 个问题,生成libmyPath.a,没有此问题。
但是同样的demo,在linux下使用,libMyPath.a ,libMyPath.so都能正常使用。

问题2.客户demo迁移至CMake工程后,将其集成到自己的工程MyProject上,报错为–
ld: error: lld doesn’t support linking directory agaginst xxxxxxxx/*.dll, use an import library

原因:CMakeLists.txt中指定动态库搜索路径有问题。因为demo中vciDlc.dll在两个文件中都有,这时用的那个bin文件下的*库文件,导致报这个错
解决:修改CMakeLists.txt如下:

#target_link_directories(HmsProfinetUse PUBLIC VciIdlSdk/idl/bin/x64) 
#改成如下
target_link_directories(HmsProfinetUse PUBLIC VciIdlSdk/idl/lib/x64) 

问题3. 生成自己的静态库linhmsprofinet.a后,集成到自己的工程后,编译自己工程,报找不到动态库-vciDLc.dll问题 ,vciDlc.dll 是编译linhmsprofinet.a所需要的第三方库,自己的工程MyProject可以不依赖vciDlc.dll。
原因:
CMakeLists.txt中没有将vciDlc.dll库文件路径暴露给外部工程,只是暴露给了hmsprofinet工程,需要将其暴露出来。
解决:修改CMakeLists.txt如下:

#指定头文件搜索路径,此路径仅仅是在当前project公开,在别的project不可见
#INCLUDE_DIRECTORIES(VciIdlSdk/idl/lib/x64) 改为如下
#指定头文件搜索路径,此路径不仅仅是在当前project公开,在别的project也可见
target_include_directories(HmsProfinetUse PUBLIC VciIdlSdk/idl/inc)

#指定引用的外部库搜索路径,此路径只在当前project公开,在别的project不可见
#LINK_DIRECTORIES(VciIdlSdk/idl/lib/x64) 改为如下
#指定引用的外部库搜索路径,此路径不仅仅在当前project公开,在别的project也可见
target_link_directories(HmsProfinetUse PUBLIC VciIdlSdk/idl/lib/x64)

#target_link_directories(HmsProfinerUse PRIVATE vciIdlc) 改为
target_link_directories(HmsProfinerUse PUBLIC vciIdlc)

问题4.在自己工程中引用hmsprofinet库相关的头文件,例如“abcc.h”,报找不到文件“abcc_config.h”,因为在abcc.h的开头#include “abcc_config,h”

/// 当前是 abcc.h ,该文件是linhmsprofinet.a所需的头文件
/// abcc.h 与 abcc_config.h不在同一个目录下,
///但是在CMakeLists.txt中指定了头文件搜索路径,所以可以简写为#include "abcc_config.h" 
#include "abcc_config.h" 

原因:
CMakeLists.txt中没有将abcc_config,h头文件路径暴露给外部工程,只是暴露给了hmsprofinet工程。
解决:在CMakeLists.txt中修改如下

#INCLUDE_DIRECTORIES(abcc_abp) #修改为以下方式
target_include_directories(HmsProfinetUse PUBLIC abcc_abp) 
#HmsProfinetUse为要生成的库的名字 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值