这是一个实际项目中遇到的问题的解决方案, 当时已有的项目庞大而复杂, 使用g++编译, 需要用到dpdk而dpdk的编译有自己的一套框架, 把产品编译脚本全部套进去显然是不现实并且工作量太大. 下面给的是一个操作示例描述了如何编译, 如果有更好的方法也请告诉我~
1: 首先把用到dpdk的相关c文件(dpdk默认不支持c++编译)编译为.o或者.a
ifeq ($(RTE_SDK),)
$(error "Please define RTE_SDK environment variable")
endif
# Default target, can be overridden by command line or environment
RTE_TARGET ?= x86_64-native-linuxapp-gcc
include $(RTE_SDK)/mk/rte.vars.mk
# all source are stored in SRCS-y
SRCS-y := dpdk_slave.c
CFLAGS += $(WERROR_FLAGS)
EXTRA_CFLAGS += -O0 -g -w -Wfatal-errors
#include $(RTE_SDK)/mk/rte.extlib.mk
include $(RTE_SDK)/mk/rte.extobj.mk
2: 在独立的c++工程把对应.a链接进去
这里的关键是 -Wl,--whole-archive 和 -Wl,--no-whole-archive, 如果不这样的话编译可能没问题, 但是程序运行结果不对, 比如dpdk找不到port之类的问题.
#RTE_TARGET=x86_64-native-linuxapp-gcc
DPDK_LIB_DIR=$(