当前位置: 技术问答>linux和unix
linux通过makefile编译静态链接库,有问题求解?
来源: 互联网 发布时间:2016-09-17
本文导语: 在一个工程里已经能够编译好了, 现在要把这几个tinyxml.o tinyxmlparse.o tinyxmlerror.o tinystr.o 这几个文件封装成静态库 ar cr tingxml.a tingxml.o ar cr......... 在Makefile 模仿其他地方加静态库的形式 INCLUDE_DIR+=-I$...
在一个工程里已经能够编译好了, 现在要把这几个tinyxml.o tinyxmlparse.o tinyxmlerror.o tinystr.o 这几个文件封装成静态库 ar cr tingxml.a tingxml.o ar cr.........
在Makefile 模仿其他地方加静态库的形式
INCLUDE_DIR+=-I$(GUI_DIR)/include
STATIC_LIB_LIST+=$(PROJECT_ROOT)/objects/tinystr.a $(PROJECT_ROOT)/objects/tinyxml.a $(PROJECT_ROOT)/objects/tinyxmlerror.a $(PROJECT_ROOT)/objects/tinyxmlparser.a
路径已经核对过了
下面makefile是这样处理的
#增加公共的库
STATIC_LIB_PATH+=
STATIC_LIB_LIST+=
CFLAGS+=$(INCLUDE_DIR)
LDFLAGS+=$(STATIC_LIB_LIST)
DEPFILE:=$(PROJECT_ROOT)/deps
.PHONY:all
all:$(DEPFILE) $(EXE_NAME)
$(DEPFILE): $(PROJECT_SRC) Makefile
@echo "Generating new dependency file...";
@-rm -f $(DEPFILE)
@for f in $(PROJECT_SRC); do
OBJ=$(OBJECTS_DIR)/`basename $$f|sed -e 's/.cpp/.o/' -e 's/.c/.o/'`;
echo $$OBJ: $$f>> $(DEPFILE);
echo ' $(CC) $$(CFLAGS) -c -o $$@ $$^'>> $(DEPFILE);
done
-include $(DEPFILE)
$(EXE_NAME):$(OBJECT_FILE)
# make -C ./filemanage
$(CC) $(CFLAGS) $(OBJECT_FILE) -o "$@" $(LDFLAGS) -L$(LIBS)
我把之前链接的这几个注释掉
#OBJECT_FILE+=$(OBJECTS_DIR)/tinystr.o
#OBJECT_FILE+=$(OBJECTS_DIR)/tinyxml.o
#OBJECT_FILE+=$(OBJECTS_DIR)/tinyxmlerror.o
#OBJECT_FILE+=$(OBJECTS_DIR)/tinyxmlparser.o
再编译后出错了/home/wujianhong/app/common/objects/tinyxmlparser.a(tinyxmlparser.o): In function `TiXmlDocument::SetError(int, char const*, TiXmlParsingData*, TiXmlEncoding)':
tinyxmlparser.cpp:(.text+0xfdc): undefined reference to `TiXmlBase::errorString'
collect2: ld returned 1 exit status
make: *** [/home/wujianhong/app/common/../user/release/hisilicon_app_dvr] 错误 1
有人帮忙吗,再提供信息
在Makefile 模仿其他地方加静态库的形式
INCLUDE_DIR+=-I$(GUI_DIR)/include
STATIC_LIB_LIST+=$(PROJECT_ROOT)/objects/tinystr.a $(PROJECT_ROOT)/objects/tinyxml.a $(PROJECT_ROOT)/objects/tinyxmlerror.a $(PROJECT_ROOT)/objects/tinyxmlparser.a
路径已经核对过了
下面makefile是这样处理的
#增加公共的库
STATIC_LIB_PATH+=
STATIC_LIB_LIST+=
CFLAGS+=$(INCLUDE_DIR)
LDFLAGS+=$(STATIC_LIB_LIST)
DEPFILE:=$(PROJECT_ROOT)/deps
.PHONY:all
all:$(DEPFILE) $(EXE_NAME)
$(DEPFILE): $(PROJECT_SRC) Makefile
@echo "Generating new dependency file...";
@-rm -f $(DEPFILE)
@for f in $(PROJECT_SRC); do
OBJ=$(OBJECTS_DIR)/`basename $$f|sed -e 's/.cpp/.o/' -e 's/.c/.o/'`;
echo $$OBJ: $$f>> $(DEPFILE);
echo ' $(CC) $$(CFLAGS) -c -o $$@ $$^'>> $(DEPFILE);
done
-include $(DEPFILE)
$(EXE_NAME):$(OBJECT_FILE)
# make -C ./filemanage
$(CC) $(CFLAGS) $(OBJECT_FILE) -o "$@" $(LDFLAGS) -L$(LIBS)
我把之前链接的这几个注释掉
#OBJECT_FILE+=$(OBJECTS_DIR)/tinystr.o
#OBJECT_FILE+=$(OBJECTS_DIR)/tinyxml.o
#OBJECT_FILE+=$(OBJECTS_DIR)/tinyxmlerror.o
#OBJECT_FILE+=$(OBJECTS_DIR)/tinyxmlparser.o
再编译后出错了/home/wujianhong/app/common/objects/tinyxmlparser.a(tinyxmlparser.o): In function `TiXmlDocument::SetError(int, char const*, TiXmlParsingData*, TiXmlEncoding)':
tinyxmlparser.cpp:(.text+0xfdc): undefined reference to `TiXmlBase::errorString'
collect2: ld returned 1 exit status
make: *** [/home/wujianhong/app/common/../user/release/hisilicon_app_dvr] 错误 1
有人帮忙吗,再提供信息
|
将静态库的文件名前面加上lib
例如:
ar cr tingxml.a tingxml.o
改成
ar cr libtingxml.a tingxml.o
例如:
ar cr tingxml.a tingxml.o
改成
ar cr libtingxml.a tingxml.o
|
虽然一般来说linux下库要加前缀lib,
但从错误提示来看并不是这个原因。因为并不是说找不到库,而是说库内的函数定义找不到。
所以除非代码本身的错误的话,这应该是库的链结顺序引起的。楼主要保证最基本的库放在最右边。
但从错误提示来看并不是这个原因。因为并不是说找不到库,而是说库内的函数定义找不到。
所以除非代码本身的错误的话,这应该是库的链结顺序引起的。楼主要保证最基本的库放在最右边。
|
和动态库加载方法一样试试 -L$(PROJECT_ROOT)/objects/ -ltinystr