mpicxx链接目标文件时出现x86_64架构下_main符号未定义错误
链接OpenMPI程序时出现"Undefined symbols for architecture x86_64: _main"错误
问题详情
编写的测试程序Demo_00.cpp代码如下:
#include <stdio.h> int main(int argc, char** argv){ printf("Hello world! "); }
通过命令mpicxx -c -o Demo_00.o Demo_00.cpp生成目标文件后,执行链接命令mpicxx -o Demo_00.exe Demo_00.o -v时出现以下错误:
Apple clang version 14.0.0 (clang-1400.0.29.202) Target: x86_64-apple-darwin22.1.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -platform_version macos 13.0.0 13.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -o Demo_00.exe -L/usr/local/Cellar/open-mpi/4.1.4_2/lib -L/usr/local/opt/libevent/lib -L/usr/local/lib Demo_00.o -lmpi -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.0/lib/darwin/libclang_rt.osx.a Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
已尝试的解决方法:
- 通过brew重装MPICH
- 更换g++编译器
- 删除设备上其他MPICH安装文件
- 指定
mpicxx完整路径执行命令
但问题仍未解决。
可能的原因与解决方法
1. 修复代码语法错误
代码中printf的字符串存在未闭合的换行问题,会导致编译器解析异常,无法正确生成main函数符号。修正后的代码:
#include <stdio.h> int main(int argc, char** argv){ printf("Hello world!\n"); return 0; // 补充符合C++标准的返回值 }
2. 重新生成目标文件
清理旧文件后重新编译,确保编译阶段无报错:
rm Demo_00.o Demo_00.exe mpicxx -c -o Demo_00.o Demo_00.cpp
若编译过程出现警告或错误,优先解决这些前置问题。
3. 用mpicxx一键完成编译链接
避免手动拆分编译和链接步骤,直接用mpicxx处理所有依赖参数:
mpicxx -o Demo_00.exe Demo_00.cpp
该命令会自动配置OpenMPI所需的编译选项与链接库,减少手动操作的误差。
4. 检查OpenMPI架构匹配性
验证当前安装的OpenMPI是否适配x86_64架构:
otool -L /usr/local/Cellar/open-mpi/4.1.4_2/lib/libmpi.dylib
若输出中无x86_64标记,重新指定架构安装:
brew uninstall open-mpi ARCHFLAGS="-arch x86_64" brew install open-mpi
5. 重置冲突的环境变量
检查是否存在冲突的编译器或MPI环境变量:
echo $CC echo $CXX echo $MPI_CC echo $MPI_CXX
若变量指向异常,重置后重新编译:
unset CC CXX MPI_CC MPI_CXX
内容的提问来源于stack exchange,提问作者sebzuddas
相关产品推荐
相关产品推荐

