You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake编译lz4ultra库时链接阶段出现符号未定义错误

解决MSYS2 MinGW64下CMake链接lz4ultra时符号未定义问题

核心原因

C编译器会对函数名进行名字修饰(Name Mangling),而lz4ultra是C语言实现的库,符号以C风格存储。当C主程序直接链接该库时,会按修饰后的名字查找符号,导致找不到原始的lz4ultra_compress_inmem。

解决方案

1. 用extern "C"包裹库函数声明

在C++主程序中包含lz4ultra头文件时,用extern "C"包裹,告诉编译器按C风格解析函数符号:

extern "C" {
#include "lz4ultra.h"
}

如果有权限修改lz4ultra的头文件,也可以在头文件中添加跨语言兼容的声明:

#ifdef __cplusplus
extern "C" {
#endif

// 原有的lz4ultra函数声明
int lz4ultra_compress_inmem(...);

#ifdef __cplusplus
}
#endif

2. 确保CMake按C语言编译lz4ultra库

在lz4ultra的CMakeLists.txt中,明确指定源文件的编译语言为C,避免CMake自动识别为C++:

add_library(lz4ultra STATIC
    src/lz4ultra.c
    # 其他相关C源文件
)
# 强制指定链接语言为C
set_target_properties(lz4ultra PROPERTIES LINKER_LANGUAGE C)
# 若有需要,指定C标准
target_compile_features(lz4ultra PRIVATE c_std_99)

3. 确认主程序CMake的链接配置

在主程序ziso的CMakeLists.txt中,确保正确链接lz4ultra库:

add_executable(ziso main.cpp)
# 链接lz4ultra库
target_link_libraries(ziso PRIVATE lz4ultra)
# 确保主程序的C++标准配置正确
target_compile_features(ziso PRIVATE cxx_std_17)

验证方法

用nm工具检查库文件中的符号:

nm -D liblz4ultra.a | grep lz4ultra_compress_inmem

如果输出显示类似00000000 T lz4ultra_compress_inmem(T表示文本段符号),说明库中的符号是C风格的。此时只要C++代码用extern "C"声明,就能正确链接。

内容的提问来源于stack exchange,提问作者Daniel Carrasco Marín

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:22:18