使用ExternalProject_Add时遇unresolved external symbol错误的解决方法
解决Windows下ExternalProject_Add链接subhook出现的未解析外部符号错误
问题根源
你用ExternalProject_Add拉取编译的subhook是UTILITY类型的构建目标,并非CMake可直接链接的库目标,因此直接执行target_link_libraries(t_test subhook)会报错。同时错误中的__imp__前缀说明编译器默认按动态库方式解析符号,但你开启了SUBHOOK_STATIC=ON编译静态库,两者符号解析逻辑不匹配。
解决方案
方案1:直接链接安装后的静态库文件
既然已指定CMAKE_INSTALL_PREFIX,可直接引用安装目录下生成的静态库:
add_executable(t_test t_test.cc) add_dependencies(t_test subhook) # 定义SUBHOOK_STATIC,告诉头文件按静态库方式处理符号 target_compile_definitions(t_test PRIVATE SUBHOOK_STATIC) # 链接安装后的静态库 target_link_libraries(t_test ${EXTERNAL_INSTALL_LOCATION}/lib/subhook.lib)
方案2:用find_package导入已安装的库(更规范)
subhook的CMake配置支持导出安装配置,可在构建完subhook后,通过find_package导入库目标:
ExternalProject_Add( subhook GIT_REPOSITORY https://github.com/Zeex/subhook.git GIT_TAG v0.8.2 SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/subhook-src" BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/subhook-build" CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DSUBHOOK_STATIC=ON -DSUBHOOK_TESTS=OFF SUBHOOK_FORCE_32BIT=ON) # 获取subhook的安装目录,用于find_package定位配置文件 ExternalProject_Get_Property(subhook INSTALL_DIR) # 导入subhook的库目标 find_package(subhook REQUIRED PATHS ${INSTALL_DIR}) include_directories(${EXTERNAL_INSTALL_LOCATION}/include) link_directories(${EXTERNAL_INSTALL_LOCATION}/lib) add_executable(t_test t_test.cc) add_dependencies(t_test subhook) target_compile_definitions(t_test PRIVATE SUBHOOK_STATIC) # 链接导入的标准库目标 target_link_libraries(t_test subhook::subhook)
关键注意点
- 必须添加
SUBHOOK_STATIC编译定义:subhook的头文件会根据这个宏决定符号处理逻辑,不添加会导致符号解析方式与实际库类型不匹配,出现__imp__开头的未解析错误。 - 确认
EXTERNAL_INSTALL_LOCATION路径正确,确保subhook编译完成后确实将库文件安装到了该目录下。
内容的提问来源于stack exchange,提问作者Kiki
相关产品推荐
相关产品推荐

