使用mpicc编译含自定义库的MPI程序遇未定义引用错误求助
解决MPICC编译自定义库时的未定义引用错误
嘿,我来帮你搞定这个问题!你遇到的undefined reference错误,根本原因不是mpicc不支持-I/-L这些选项——其实mpicc就是GCC的包装器,这些选项和gcc完全兼容的。问题出在你只告诉了链接器去哪里找库文件,却没告诉它要链接哪个具体的库/目标文件。
先梳理下你的问题细节
你用了这些编译命令:
mpicc -I$(CURRENT_DIR)/util -I$(CURRENT_DIR) -L$(CURRENT_DIR)/util -o server server.c mpicc -I./util -I. -L./util -o server server.c
但你的util文件夹里的list.c、list.o这些包含自定义函数实现的文件,并没有被纳入编译流程,所以链接器找不到list_create、list_add这些函数的具体定义,才抛出了错误。
几种可行的解决方案
方案1:直接链接目标文件
既然已经有编译好的list.o,直接把它加到编译命令的末尾就行,让链接器把它和server.c的编译结果合并:
mpicc -I./util -I. -o server server.c ./util/list.o
如果list.c还没编译成目标文件,也可以直接编译源文件:
mpicc -I./util -I. -o server server.c ./util/list.c
方案2:打包成静态库再链接
如果你的自定义模块不止一个文件,做成静态库会更便于管理:
- 先编译
list.c为目标文件:
gcc -c ./util/list.c -o ./util/list.o
- 打包成静态库
liblist.a:
ar rcs ./util/liblist.a ./util/list.o
- 然后用
-L指定库路径,-l指定库名(注意库名要去掉前缀lib和后缀.a):
mpicc -I./util -I. -L./util -o server server.c -llist
补充说明
-I选项是告诉编译器去哪里找头文件,你这部分已经做对了;-L是告诉链接器去哪里找库文件,但必须配合-l指定具体库,或者直接指定目标文件,链接器才知道要把哪些函数实现打包进最终的可执行文件里。
内容的提问来源于stack exchange,提问作者Marc G.G
相关产品推荐
相关产品推荐

