项目场景:
客户给了一个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为要生成的库的名字