Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 具有多个子模块的Makefile_C_Makefile - Fatal编程技术网

C 具有多个子模块的Makefile

C 具有多个子模块的Makefile,c,makefile,C,Makefile,我的课程结构如下: main.c Makefile Submodule --{somefiles} --Makefile 子模块正在创建库子模块.a。它有许多源文件,需要一些库 我只想知道 子模块中的Makefile知道如何制作子模块。a 子模块中的Makefile设置变量submodule\u LDFLAGS和submodule\u LDLIBS 如何在根项目目录中写入Makefile: 它将在子模块中使用Makefile创建子模块 它会将SUBMODULE\u LDFLAGS和SUBMOD

我的课程结构如下:

main.c
Makefile
Submodule
--{somefiles}
--Makefile
子模块正在创建库
子模块.a
。它有许多源文件,需要一些库

我只想知道

  • 子模块中的
    Makefile
    知道如何制作
    子模块。a
  • 子模块中的
    Makefile
    设置变量
    submodule\u LDFLAGS
    submodule\u LDLIBS
  • 如何在根项目目录中写入
    Makefile

  • 它将在子模块中使用Makefile创建
    子模块
  • 它会将
    SUBMODULE\u LDFLAGS
    SUBMODULE\u LDLIBS
    添加到自己的变量中吗
  • 最后,我希望main
    Makefile
    中的以下命令正常工作:

    TARGET = MyProgram
    OBJS = $(TARGET).o submodule/submodule.a
    
    $(TARGET): $(OBJS)
        $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)
    
    现在它创建了
    MyProgram.o
    ,但无法创建
    MyProgram
    ,因为
    Makefile
    不知道如何创建
    子模块/submodule.a

    我可以添加行:

    submodule/submodule.a:
        make -C submodule
    

    但是它不能帮助我处理丢失的库。

    子Make无法直接将变量传递给父进程。有(至少)两种间接方式

    您可以让子Make编写一个包含变量值的文件,然后父Make可以读取该文件

    您可以复制构成这些变量的
    子模块/Makefile
    部分,并将其放入
    Makefile
    中。更好的是,您可以将该代码隔离在一个单独的文件中,然后这两个makefile将
    包括在内

    编辑:

    递归Make的一个缺点是它会中断Make的大部分依赖处理。在这种情况下,当且仅当库的一个源发生更改时,没有干净的方法让子make运行

    您可以将子模块源的列表(或构成该列表的代码)放在一个单独的文件中,这两个makefile将
    包括在其中。然后这些文件可以是
    $(TARGET)
    的先决条件之一


    或者,您可以将
    子模块/submodule.a
    作为虚假目标。在这种情况下,Make每次都会重新生成二进制文件,但在其他情况下它会工作得很好。

    能否修改
    子模块/Makefile
    ?关于生成
    子模块.a的指令如何?对
    子模块.a
    源代码进行任何更改后,我的解决方案将不会重新生成
    子模块.a
    。@Ari:这不是你的问题,但很容易解决。你对我关于变量的回答满意吗?部分满意,但似乎没有更好的解决方案,而且这个解决方案有效。