Makefile 创建静态库而不是动态库
我想创建静态库,但在这个简单的任务上我失败了 首先,我只是尝试获取所有Makefile 创建静态库而不是动态库,makefile,Makefile,我想创建静态库,但在这个简单的任务上我失败了 首先,我只是尝试获取所有.o文件,并通过ar rcs wrapper/libxgboostwrapper.a./*生成静态库,但失败了。事实上,当我制作其他依赖于XGBoost的东西时,它会出现错误:未定义对XGBoosterFree的引用 此函数在包装器部分中定义,没有文件wrapper/libxgboostwrapper.o。因此,为了创建一个静态库,首先我们必须创建包装器/libxgboostwrapper.o,其次,在所有需要的.o文件上运行
.o
文件,并通过ar rcs wrapper/libxgboostwrapper.a./*
生成静态库,但失败了。事实上,当我制作其他依赖于XGBoost的东西时,它会出现错误:未定义对XGBoosterFree的引用
此函数在包装器部分中定义,没有文件wrapper/libxgboostwrapper.o
。因此,为了创建一个静态库,首先我们必须创建包装器/libxgboostwrapper.o
,其次,在所有需要的.o
文件上运行ar rcs
我是如何修改Makefile的
ifeq ($(OS), Windows_NT)
LIBRABIT = subtree/rabit/lib/librabit_empty.a
DLIB = wrapper/xgboost_wrapper.dll
SLIB = wrapper/xgboost_wrapper.lib
else
LIBRABIT = subtree/rabit/lib/librabit.a
DLIB = wrapper/libxgboostwrapper.so
SLIB = wrapper/libxgboostwrapper.a
endif
WRAP = wrapper/libxgboostwrapper.o
TARGET = $(BIN) $(OBJ) $(DLIB) $(SLIB) $(WRAP)
wrapper/libxgboostwrapper.o
添加了与wrapper/libxgboostwrapper.so
完全相同的依赖项
wrapper/libxgboostwrapper.o: wrapper/xgboost_wrapper.cpp src/utils/*.h src/*.h src/learner/*.hpp src/learner/*.h updater.o gbm.o io.o $(LIBRABIT) $(LIBDMLC)
$(BIN)
、$(MOCKBIN)
、$(DLIB)
完成所有操作后,我正在尝试编译(或制作?)我的$(包装)
包装器/libxgboostwrapper.a
$(SLIB) : updater.o gbm.o io.o $(WRAP) $(LIBRABIT) $(LIBDMLC)
ar rcs $@ $^
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10
我做错了什么?对我来说,这似乎是编译
。因此
和.o
文件应该是相同的,除了标志-未使用共享的
。这可能需要几次迭代,因为您似乎对这些文件的工作方式有一些误解
步骤1:首先,让我们编译一个源文件以生成一个目标文件:
g++ -o wrapper/xgboostwrapper.o -c wrapper/xgboost_wrapper.cpp
(不要将对象文件称为“libxgboostwrapper.o”。“lib”前缀表示库,“.o”后缀表示对象文件,当您同时使用这两个后缀时,会感到混淆。)
在有效之前不要继续。
第2步:在makefile中编写一条规则:
wrapper/xgboostwrapper.o: wrapper/xgboost_wrapper.cpp
$(CXX) $(CFLAGS) -o $@ $<
wrapper/xgboostwrapper.o:wrapper/xgboost\u wrapper.cpp
$(CXX)$(CFLAGS)-o$@$<
在有效之前不要继续。
步骤3:找出它实际需要的头文件,并将其作为先决条件添加。(使用通配符添加所有现有头作为先决条件是个坏主意。):
wrapper/xgboostwrapper.o:wrapper/xgboost\u wrapper.cpp src/utils/foo.h src/xgboost.h
$(CXX)$(CFLAGS)-o$@$<
试试看,告诉我们进展如何,然后我们就可以继续了。非常感谢!不幸的是,我在没有你回答的情况下解决了我的问题!:)首先,我生成了对象文件wrapper.o,然后简单地将所有需要的对象文件添加到一个库中。
wrapper/xgboostwrapper.o: wrapper/xgboost_wrapper.cpp
$(CXX) $(CFLAGS) -o $@ $<
wrapper/xgboostwrapper.o: wrapper/xgboost_wrapper.cpp src/utils/foo.h src/xgboost.h
$(CXX) $(CFLAGS) -o $@ $<