Makefile 中动态链接库的顺序

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 不忽略。

你可能感兴趣的:(Makefile 中动态链接库的顺序)