Mac OSX下编译C++ HDF5代码出现Linker Command Failed错误如何解决
问题原因与解决方案
首先明确:你怀疑的32/64位架构不兼容是极低概率原因,90%以上的情况是编译命令没有关联HDF5库文件,或者你自己写的readH5函数对应的源文件没有参与编译。
ld: symbol(s) not found for architecture x86_64
这个报错的意思是:链接器在编译目标的x86_64架构下,找不到你代码中调用的某个函数的具体实现,你贴的报错已经明确是找不到readH5(std::string)这个函数的实现。
情况1:readH5是你自己写的函数
如果这个函数是你放在其他.cpp文件里实现的,只需要把对应的源文件也加到编译命令里即可,比如你在h5_utils.cpp里写了readH5的实现,命令改成:g++ -std=c++11 test.cpp h5_utils.cpp
情况2:readH5是HDF5库提供的函数
这就是典型的漏加链接参数的问题,C++编译第三方库的时候必须手动指定头文件路径、库文件路径和要链接的库名,你原来的命令只编译了自己的代码,没有关联HDF5的内容,所以报错。
最简解决方法
HDF5安装时自带了编译包装工具h5c++,会自动配置所有路径和链接参数,直接用这个命令替换g++即可:h5c++ -std=c++11 test.cpp
编译完直接生成可执行文件a.out,直接运行即可。
手动写编译命令的方法
如果h5c++找不到,就手动补全参数:
- 先确认HDF5安装路径,如果你用Homebrew安装:
- Intel芯片Mac路径:
/usr/local/Cellar/hdf5/你的HDF5版本号/ - M系列ARM芯片Mac路径:
/opt/homebrew/Cellar/hdf5/你的HDF5版本号/
- Intel芯片Mac路径:
- 把路径填到编译命令里,示例(Intel Mac,HDF5版本1.14.3):
g++ -std=c++11 test.cpp \ -I/usr/local/Cellar/hdf5/1.14.3/include \ -L/usr/local/Cellar/hdf5/1.14.3/lib \ -lhdf5 -lhdf5_cpp
其中-I后面是头文件路径,-L后面是库文件路径,-lhdf5和-lhdf5_cpp是要链接的C和C++版本HDF5库。
极低概率:确实是架构不兼容
如果上面的方法都试了还是报错,再排查架构问题:
- 打开终端执行
file 你的HDF5库文件路径/libhdf5.a,看输出里是否包含x86_64(Intel芯片需要)或者arm64(M系列芯片需要) - 如果缺少对应架构,重新安装匹配你系统架构的HDF5即可,Homebrew默认安装的版本都是匹配当前系统架构的,正常不会出现这个问题。
内容的提问来源于stack exchange,提问作者Ken Reid
相关产品推荐
相关产品推荐

