cannot locate symbol “_ZTTNSt6__ndk114basic_ofstreamIcNS_11char_traitsIcEEEE“ 的解决办法

使用clang++编译出来的android程序,实际真机运行出现 cannot locate symbol "_ZTTNSt6__ndk114basic_ofstreamIcNS_11char_traitsIcEEEE" referenced by

vayu:/ # /data/local/cmix                                                                                                                                  
CANNOT LINK EXECUTABLE "/data/local/cmix": cannot locate symbol "_ZTTNSt6__ndk114basic_ofstreamIcNS_11char_traitsIcEEEE" referenced by "/data/local/cmix"...

这个简单的解决办法是,加-static参数,改一下make file在flags里加上,如下:

#CC = clang++
CC = /Volumes/data/Codes/AndroidNDK12479018.app/Contents/NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android30-clang++
LFLAGS = -std=c++14 -Wall 

#all: LFLAGS += -Ofast -march=native
all: LFLAGS += -Ofast -static 
all: cmix enwik9-preproc remap

debug: LFLAGS += -ggdb
debug: cmix enwik9-preproc remap

cmix: src/coder/decoder.cpp src/coder/decoder.h src/coder/encoder.cpp src/coder/encoder.h src/context-manager.cpp src/context-manager.h src/contexts/bit-context.cpp src/contexts/bit-context.h src/contexts/bracket-context.cpp src/contexts/bracket-context.h src/contexts/combined-context.cpp src/contexts/combined-context.h src/contexts/context-hash.cpp src/contexts/context-hash.h src/contexts/context.h src/contexts/indirect-hash.cpp src/contexts/indirect-hash.h src/contexts/interval-hash.cpp src/contexts/interval-hash.h src/contexts/interval.cpp src/contexts/interval.h src/contexts/sparse.cpp src/contexts/sparse.h src/mixer/byte-mixer.cpp src/mixer/byte-mixer.h src/mixer/lstm-layer.cpp src/mixer/lstm-layer.h src/mixer/lstm.cpp src/mixer/lstm.h src/mixer/mixer-input.cpp src/mixer/mixer-input.h src/mixer/mixer.cpp src/mixer/mixer.h src/mixer/sigmoid.cpp src/mixer/sigmoid.h src/mixer/sse.cpp src/mixer/sse.h src/models/bracket.cpp src/models/bracket.h src/models/byte-model.cpp src/models/byte-model.h src/models/direct-hash.cpp src/models/direct-hash.h src/models/direct.cpp src/models/direct.h src/models/indirect.cpp src/models/indirect.h src/models/fxcmv1.cpp src/models/fxcmv1.h src/models/match.cpp src/models/match.h src/models/model.h src/models/paq8.cpp src/models/paq8.h src/models/ppmd.cpp src/models/ppmd.h src/predictor.cpp src/predictor.h src/preprocess/dictionary.cpp src/preprocess/dictionary.h src/preprocess/preprocessor.cpp src/preprocess/preprocessor.h src/runner.cpp src/states/nonstationary.cpp src/states/nonstationary.h src/states/run-map.cpp src/states/run-map.h src/states/state.h
	$(CC) $(LFLAGS) src/coder/decoder.cpp src/coder/encoder.cpp src/context-manager.cpp src/contexts/bit-context.cpp src/contexts/bracket-context.cpp src/contexts/combined-context.cpp src/contexts/context-hash.cpp src/contexts/indirect-hash.cpp src/contexts/interval-hash.cpp src/contexts/interval.cpp src/contexts/sparse.cpp src/mixer/byte-mixer.cpp src/mixer/lstm-layer.cpp src/mixer/lstm.cpp src/mixer/mixer-input.cpp src/mixer/mixer.cpp src/mixer/sigmoid.cpp src/mixer/sse.cpp src/models/bracket.cpp src/models/byte-model.cpp src/models/direct-hash.cpp src/models/direct.cpp src/models/indirect.cpp src/models/fxcmv1.cpp src/models/match.cpp src/models/paq8.cpp src/models/ppmd.cpp src/predictor.cpp src/preprocess/dictionary.cpp src/preprocess/preprocessor.cpp src/runner.cpp src/states/nonstationary.cpp src/states/run-map.cpp -o cmix

enwik9-preproc: src/enwik9-preproc/article_reorder.h src/enwik9-preproc/main.cpp src/enwik9-preproc/misc.h src/enwik9-preproc/phda9_preprocess.h
	$(CC) $(LFLAGS) src/enwik9-preproc/main.cpp -o enwik9-preproc
	
remap: src/enwik9-preproc/article_remap.cpp
	$(CC) src/enwik9-preproc/article_remap.cpp -o remap

clean:
	rm -f cmix enwik9-preproc remap

make clean && make

重新上传,运行ok.

 adb push cmix /sdcard/
adb shell
vayu:/ # cp /sdcard/cmix /data/local/cmix                                                                                                                   
vayu:/ # /data/local/cmix
cmix version 21
Compress:
    with dictionary:    cmix -c [dictionary] [input] [output]
    without dictionary: cmix -c [input] [output]
    force text-mode:    cmix -t [dictionary] [input] [output]
    no preprocessing:   cmix -n [input] [output]
    only preprocessing: cmix -s [dictionary] [input] [output]
                        cmix -s [input] [output]
Decompress:
    with dictionary:    cmix -d [dictionary] [input] [output]
    without dictionary: cmix -d [input] [output]

### 关于符号 '_ZN7' 无法定位的解决方案 在 IT 上下文中,“_ZN7” 类型的错误通常与 C++ 编译器生成的名称 mangling(名称修饰)有关。C++ 使用名称修饰来区分不同类型的函数重载以及类成员函数。当链接器报告 “cannot locate symbol _ZN7”,这可能意味着某些库文件缺失或者编译选项不一致。 以下是可能导致此问题的原因及其解决方法: #### 原因分析 1. **缺少必要的动态库或静态库** 如果程序依赖某个特定的库,而该库未被正确加载,则可能会导致此类错误。确保所有必需的库都已安装并正确配置到项目的构建路径中[^1]。 2. **版本冲突** 不同版本的库之间可能存在二进制兼容性问题。如果使用的库版本与其头文件定义不符,也可能引发类似的链接失败情况。验证所用库的版本是否匹配项目需求[^1]。 3. **编译器设置差异** 当源码由不同的编译器环境编译时,由于各编译器实现细节上的区别,会造成最终目标代码间存在不可调和的区别。统一整个开发流程中的工具链可以有效避免这类状况发生。 4. **命名空间污染或其他语法错误** 错误地修改了标准模板库(STL)内部结构或是其他第三方框架的核心部分也会引起这种异常现象。仔细审查是否有不当更改影响到了正常运行逻辑。 #### 解决方案建议 - **确认依赖关系** 检查Makefile 或者 cmake 配置脚本里有没有遗漏指定任何外部资源;另外还要注意操作系统平台特性对于共享对象(.so 文件) 的处理方式有所不同,在 Linux 下可通过 `ldd` 命令查看可执行文件实际关联哪些.so模块[^1]。 - **重新编译受影响组件** 清理旧的对象文件(`make clean`)后再尝试全量重建工程,这样能消除潜在残留物带来的干扰因素[^1]。 - **更新至最新稳定版软件包** 对那些频繁迭代更新的技术栈而言,及时获取修复补丁往往能够快速解决问题所在。 ```bash # 示例命令用于调试Linux下的动态链接问题 ldd your_executable | grep "not found" ``` #### 进一步排查手段 如果以上常规操作仍未能奏效,还可以借助一些专门针对ELF格式文件分析的工具进一步深入探究具体卡在哪一环节出了差错。比如使用 `nm`, `readelf` 来手动解析符号表信息找出确切位置。 ```bash # 查看目标文件内的符号定义详情 nm -C --defined-only libexample.a # 显示 ELF 可执行/共享库里的节区头部数据 readelf -S /path/to/binary ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值