Makefile 中编译选项的位置可以随意变化,但是动态链接库之间的相对位置有讲究。
比如在编译一个项目时遇到错误如下:
/usr/bin/ld: /usr/local/lib/libgrpc++_reflection.so:
undefined reference to symbol '_ZN6google8protobuf8internal16RegisterAllTypesEPKNS0_8MetadataEi'
/usr/bin/ld: note:
'_ZN6google8protobuf8internal16RegisterAllTypesEPKNS0_8MetadataEi'
is defined in DSO /usr/local/lib/libprotobuf.so
so try adding it to the linker command line
但是我在 Makefile 中已经链接了 libprotobuf
这个动态库,为什么说找不到呢:
LDFLAGS = -L/usr/local/lib `pkg-config --libs grpc++ grpc` -Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed -lprotobuf -lpthread -ldl -lssl
因为 libgrpc++_reflection 依赖 libprotobuf,编译器从左向右查找,所以应该把 -lprotobuf 放在前面,这个顺序不能乱来:
LDFLAGS = -L/usr/local/lib `pkg-config --libs grpc++ grpc` -Wl,--no-as-needed -lprotobuf -lpthread -ldl -lssl -lgrpc++_reflection -Wl,--as-needed
-Wl
将后面跟的参数传递给连接程序。
–as-needed
就是忽略链接时没有用到的动态库,--no-as-needed
不忽略。
网友评论