如何使用和构建makefile将scip链接到C?

如何使用和构建makefile将scip链接到C?,c,makefile,gnu-make,scip,C,Makefile,Gnu Make,Scip,我是C语言的新手。我只需要使用scip中的一个函数。我制作了一个文件,如下所示: SCIPDIR=$/Users/amin/Documents/cProgram/scipoptsuite-6.0.2/scip include $(SCIPDIR)/make/make.project %.o: %.c $(CC) $(FLAGS) $(OFLAGS) $(BINOFLAGS) $(CFLAGS) -c $< all: cmain cmain: cmain.o $(LI

我是C语言的新手。我只需要使用scip中的一个函数。我制作了一个文件,如下所示:

SCIPDIR=$/Users/amin/Documents/cProgram/scipoptsuite-6.0.2/scip

include $(SCIPDIR)/make/make.project

%.o: %.c
    $(CC) $(FLAGS) $(OFLAGS) $(BINOFLAGS) $(CFLAGS) -c $<

all: cmain

cmain: cmain.o
    $(LINKCXX) cmain.o $(LINKCXXSCIPALL) $(LDFLAGS) $(LINKCXX_o) cmain

我只是试着按照别人的建议去做。如果可以的话,请帮助我。我该怎么办?

你做得不对

First without target第一个配方就是调用的配方,因此
all
目标应该先执行

第二:不要
包含
其他文件,删除除目录变量和
所有
目标之外的所有内容

您只需添加到LD_FLAGS变量,自动规则将为您链接。除非scip项目引入了一系列你需要的变量,否则我不知道为什么你需要在这里包含它的make文件信息

另外值得注意的是,您加载到变量中的当前路径在赋值中有一个不正确的前导
$
符号,为此链接,我们需要确保其到libscip.so(或libscip.a)的完整路径

i、 e.
LD_FLAGS+=-L${DIR_包含\u libscip.so}-lscip

您可能还需要指向头文件/包含文件:

CPP\u FLAGS+=-I${DIR\u在\u includes\u of scip}/include之前/include
(如果它们作为
包含,或者不包含
/include
,如果它们作为
包含,则会进一步增加;这取决于项目样式。大多数项目使用
/include/projname
模式,以便将项目有效地保留在其自己的名称空间中,用于包含文件,以避免冲突。)美国


这应该是假设所有其他东西都已构建并就位,并且我不需要了解scip的任何特别之处…

您想将两件事分开吗

  • 建筑SCIP
  • 构建和链接您的程序
  • 建筑SCIP 通常,人们会在大多数类似UNIX的系统上使用软件包管理器安装此库,或者执行
    makeinstall
    将其复制到系统中。然后,将自动找到头文件等。如果您不想这样做,请选择“bundle”SCIP与您的程序一起,通常为您的程序分发该版本的副本或链接该版本的副本(sourcetree中的代码副本,例如“external”或使用git子模块…)。但是,在任何情况下,您都不希望SCIP的路径是绝对的。例如,使用以下布局:

    ./
    -- external/SCIP
    -- cmain.c
    -- Makefile
    
    在Makefile中,您可以像这样设置SCIPDIR供以后使用:

    SCIPDIR := "./external/SCIP"
    
    但是,首先,您应该了解如何手动构建。为此,您可以输入“/external/SCIP”并按照自述文件中的说明构建库(通常是通过执行类似于
    /configure&&make&&make install
    )的操作)。如果您想自动化此操作,可以从您的主文件中执行此操作。为此,您可以添加一个我们称之为
    dep
    “虚假”目标(即,不完全创建一个输出,而是构建所有依赖项的目标):

    dep:
            cd $(SCIPDIR); ./configure
            $(MAKE) -C $(SCIPDIR)
    
    .PHONY: dep
    
    (感谢@UpAndAdam指出在运行配置脚本之前必须更改CWD)

    为此,我们递归地为我们的子项目调用make。我们不想在系统范围内安装这些文件,所以我们只构建库

    构建您的程序 现在,我们添加了两个模式规则,用于指定如何构建和链接C程序。GNU/Make(您正在使用的一个)已经有内置后缀规则s.t。默认情况下,它已经知道如何构建C程序,但是后缀规则很难处理,并且您已经使用了其他GNU/Make功能,因此我们也可以使用大致等效的模式规则并禁用内置规则:

    %.o: %.c
            $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
    
    %: %.o
             $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(LDLIBS)
    
    .SUFFIXES:
    
    但是,如果我们现在执行
    make all
    ,它将失败,因为我们还没有指定包含路径等。为此,我们将以前使用的变量设置为所需的值(我在手机上猜测了具体的路径):

    把它们放在一起 现在,这应该或多或少能起作用。但有一点是,将
    all
    作为默认目标是很常见的,即Makefile中列出的第一个目标。因此我们写:

    CPPFLAGS += -I$(SCIPDIR)/include
    LDFLAGS += -L$(SCIPDIR)
    LDLIBS += -lscip
    
    all: dep cmain
    
    %.o: %.c
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
    
    %: %.o
        $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(LDLIBS)
    
    dep:
        cd $(SCIPDIR); ./configure.sh
        $(MAKE) -C $(SCIPDIR)
    
    .PHONY: dep all
    .SUFFIXES:
    
    CPPFLAGS+=-I$(SCIPDIR)/include
    LDFLAGS+=-L$(SCIPDIR)
    LDLIBS+=-lscip
    全部:副首席执行官
    %.o:%.c
    $(CC)$(CPPFLAGS)$(CFLAGS)-c-o$@$<
    %:%
    $(CC)$(LDFLAGS)$(CFLAGS)-o$@$^$(LDLIBS)
    副署长:
    cd$(SCIPDIR);./configure.sh
    $(制造)-C$(SCIPDIR)
    .冒牌货:副总裁
    .后缀:
    

    注意:我在手机上,所以我无法测试,也不知道确切的路径,但这应该可以指导您。出于同样的原因,我这里的代码在Makefile中使用空格而不是制表符。请确保替换它们。

    Makefile的名称是什么?您使用了什么命令行来调用make?请发布完整的结果输出。name是Makefile,并且在Makefile和cmain.c存在的目录中,我只使用命令:make your post.State显式地说明您所做的事情,并显示完整的结果。我将运行Makefile后得到的所有内容放在前面,因为您有一美元在不应该存在的路径前面,只使用绝对路径。您的意思是我应该编写
    all:cmain
    aMakefile的第一行是什么?你能帮我更多吗?我在那个目录中构建了make,它很成功。现在我在那个目录中有一个终端,它是使用scip构建的。但是我必须调用这个函数:SCIPgetGeneratorsSymmetry from scip。我不知道how@sherek_66这对SCIPgetGeneratorsSymmetry调用有帮助吗?我是说t文件中的第一个菜谱应该是all:cmain其他东西可以放在第一位,但我不会把其他菜谱放在第一位(
    %.o:%.c
    是您放在它前面的菜谱)我仍然不知道如何使用C和skip!我创建了make文件,但不知道下一步是什么!我是数学专业的学生,不是计算机科学。我以前从未编程过!在创建make文件后,有没有任何教程可以展示我如何使用scip中的一些函数编译C文件!你不需要定义任何模式规则,也不需要使用
    %.o: %.c
            $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
    
    %: %.o
             $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(LDLIBS)
    
    .SUFFIXES:
    
    all: dep cmain
    
    .PHONY: dep all
    
    CPPFLAGS += -I$(SCIPDIR)/include
    LDFLAGS += -L$(SCIPDIR)
    LDLIBS += -lscip
    
    CPPFLAGS += -I$(SCIPDIR)/include
    LDFLAGS += -L$(SCIPDIR)
    LDLIBS += -lscip
    
    all: dep cmain
    
    %.o: %.c
        $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
    
    %: %.o
        $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(LDLIBS)
    
    dep:
        cd $(SCIPDIR); ./configure.sh
        $(MAKE) -C $(SCIPDIR)
    
    .PHONY: dep all
    .SUFFIXES: