1:-Xlinker
Linux静态库链接顺序问题解决:
$(CXX) $(LINKFLAGS) $(OBJS) -Xlinker “-(” $(LIBS) -Xlinker “-)” -o $@
通过将所有需要被链接的静态库放入 -Xlinker “-(” 与 -Xlinker “-)” 之间,可以是 g++ 链接过程中, 自动循环链接所有静态库,从而解决了原本的链接顺序问题。
2.config.mk
# Generated by config_brpc.sh, don't modify manually
SYSTEM=Linux
HDRS=/usr/include/
LIBS=/usr/lib /usr/lib/x86_64-linux-gnu
PROTOC=/usr/bin/protoc
PROTOBUF_HDR=/usr/include/
CC=gcc
CXX=g++
GCC_VERSION=90300
STATIC_LINKINGS= -lgflags -lprotobuf -lleveldb -lsnappy -lbrpc -lnacos-cli
DYNAMIC_LINKINGS=-lpthread -lssl -lcrypto -ldl -lz -lrt -lcurl
CPPFLAGS=-DBRPC_WITH_GLOG=0 -DGFLAGS_NS=google -g
ifeq ($(NEED_LIBPROTOC), 1)
STATIC_LINKINGS+=-lprotoc
endif
ifeq ($(NEED_GPERFTOOLS), 1)
DYNAMIC_LINKINGS+=-ltcmalloc_and_profiler
endif
ifeq ($(NEED_GTEST), 1)
STATIC_LINKINGS+=-lgtest
STATIC_LINKINGS+=-lgtest_main
endif
3.Makefile
# $(shell ~/x64tool-root/protobuf/bin/protoc -I=./protobuf/ --cpp_out=./cppProtobuf ./protobuf/*)
PWD=$(shell pwd)
$(info ${PWD})
include ${PWD}/config.mk
#target
TARGET := VehicleServer
#toolchain
CXX := g++
CC := gcc
#flags
CFLAGS := -g -O2
# CXXFLAGS := $(CFLAGS) -std=c++11 -lstdc++ -Wall -Wsign-compare
CXXFLAGS += $(CPPFLAGS) -std=c++0x -DNDEBUG -O2 -D__const__= -pipe -W -Wall -Wno-unused-parameter -fPIC -fno-omit-frame-pointer
#lib
LINK_OPTIONS = -Xlinker "-(" $^ -Wl,-Bstatic $(STATIC_LINKINGS) -Wl,-Bdynamic -Xlinker "-)" $(DYNAMIC_LINKINGS)
LDFLAGS := -L./lib
DEFINES :=
LIBPATHS := $(addprefix -L, $(LIBS))
LIBPATHS += ${LDFLAGS}
LD_LIBRARY_PATH =
PROTOS = $(wildcard ./protobuf/*.proto)
PROTO_OBJS = $(PROTOS:.proto=.pb.o)
PROTO_GENS = $(PROTOS:.proto=.pb.h) $(PROTOS:.proto=.pb.cc)
PROTOC_EXTRA_ARGS =
# $(shell $(PROTOC) --cpp_out=./protobuf --proto_path=./protobuf $(PROTOS))
#include
HDRPATHS := $(addprefix -I, $(HDRS))
HDRS = include tcpServer deviceMsg global protobuf serverMsg msgList nacos include/nacos brpc include/brpc
HDRPATHS += $(addprefix -I$(PWD)/, $(HDRS))
$(info "******${HDRPATHS}")
#Source files
SOURCE := VehicleServer.cpp\
tcpServer/TCPServer.cpp\
tcpClient/TCPClient.cpp\
global/global.cpp\
deviceMsg/deviceMsg.cpp\
deviceMsg/location.cpp\
deviceMsg/alarm.cpp\
deviceMsg/reply.cpp\
deviceMsg/carID.cpp\
deviceMsg/location.cpp\
deviceMsg/speed.cpp\
serverMsg/serverMsg.cpp\
serverMsg/driver.cpp\
msgList/msgInfoList.cpp\
serverMsg/param.cpp\
nacos/nacosControl.cpp\
nacos/nacos.cpp\
brpc/httpServer.cpp
# %.cpp -> %.o
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
$(info "****$(OBJS)")
.PHONY:all
all:$(TARGET)
# link
$(TARGET):$(PROTO_OBJS) $(OBJS)
$(CXX) ${LIBPATHS} ${LINK_OPTIONS} -o $@
%.o:%.cpp
$(CXX) -c $(HDRPATHS) $(CXXFLAGS) $< -o $@
%.pb.cc %.pb.h:%.proto
@echo "Generating $@"
@$(PROTOC) --cpp_out=./protobuf --proto_path=./protobuf $(PROTOC_EXTRA_ARGS) $<
%.o:%.cc
@echo "Compiling $@"
@$(CXX) -c $(HDRPATHS) $(CXXFLAGS) $< -o $@
.PHONY:clean
clean:
rm -rf ${TARGET} $(PROTO_S) ${PROTO_H} $(PROTO_OBJS) $(OBJS) $(PROTO_GENS)