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 $@ $^
    
  • 它在步骤5失败,错误如下:

    /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 $@ $<