使用CMake将静态库链接到共享库的方式是否正确?LNK2019链接错误求助
问题分析与解决方案
首先明确:你用CMake将静态库链接到共享库的方式本身是正确的,出现的LNK2019错误并非链接方式问题,而是静态库EMR依赖的系统库未被纳入链接流程。
错误原因
报错中的__imp__CM_Get_DevNode_PropertyW@24是Windows设备管理API的符号,属于系统库setupapi.lib。静态库testemr.lib在编译时依赖这个库,但CMake不会自动传递导入静态库的系统依赖,所以当你把EMR链接到共享库camsdk时,链接器找不到这个系统符号。
修复方案
你需要为导入的静态库EMR显式声明它的接口依赖,这样CMake会自动把依赖的系统库传递给链接camsdk的环节。修改你的CMake代码,在设置EMR的IMPORTED_LOCATION之后添加以下内容:
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") # 给EMR静态库添加系统依赖setupapi.lib target_link_libraries(EMR INTERFACE setupapi.lib) endif()
或者用属性设置的方式:
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") set_property(TARGET EMR PROPERTY INTERFACE_LINK_LIBRARIES setupapi.lib) endif()
为什么你的链接写法是对的
target_link_libraries(${SHARED_BINARY} PUBLIC EMR)这个写法完全正确:
- 使用
PUBLIC会将EMR的接口属性(包括我们刚添加的setupapi.lib依赖)传递给所有链接camsdk的目标 - 导入静态库的链接逻辑本身没有问题,只是缺失了依赖的系统库声明
内容的提问来源于stack exchange,提问作者sas
相关产品推荐
相关产品推荐

