错误信息
g++ -shared -o libsotest.so so_test.o -L./libavformat -L./libavcodec -L./libavutil -L./libswresample -lavformat -lavcodec -lavutil -lswresample -lpthread -Wall -Bsymbolic
/usr/bin/ld: ./libavcodec/libavcodec.a(ac3dsp.o): relocation R_X86_64_PC32 against 符号 `ff_ac3_bap_bits' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: 最终连接失败: 错误的值
collect2: error: ld returned 1 exit status
make: *** [libsotest.so] 错误 1
解决办法是修改makefile
在g++的最后加上-Wl,-Bsymbolic ,再试就可以了,注意g++这里是输出动态库
g++ -shared -o $@ $(OBJS) $(LIB_PATH) $(LIBS) -Wl,-Bsymbolic
# 1、准备工作,编译方式、目标文件名、依赖库路径的定义。
CC = g++
CFLAGS := -Wall -O3 -DUSE_MMAP -fPIC
OBJS = so_test.o #.o文件与.cpp文件同名
#OBJS += queue.o
LIB = libsotest.so # 目标文件名
INCLUDE_PATH = -I./
LIB_PATH += -L./libavformat
LIB_PATH += -L./libavcodec
LIB_PATH += -L./libavutil
LIB_PATH += -L./libswresample
LIBS += -lavformat
LIBS += -lavcodec
LIBS += -lavutil
LIBS += -lswresample
LIBS += -lpthread
all : $(LIB)
# 2. 生成.o文件
%.o : %.cpp
$(CC) $(CFLAGS) $< -c -o $@ $(INCLUDE_PATH) $(LIB_PATH) $(LIBS)
#-fpic
# 3. 生成动态库文件
$(LIB) : $(OBJS)
rm -f $@
g++ -shared -o $@ $(OBJS) $(LIB_PATH) $(LIBS) -Wl,-Bsymbolic
rm -f $(OBJS)
tags :
ctags -R *
# 4. 删除中间过程生成的文件
clean:
rm -f $(OBJS) $(TARGET) $(LIB)
参考文章
http://blog.csdn.net/cjf_iceking/article/details/25825569
http://blog.csdn.net/anzhuangguai/article/details/49124719