【问题标题】:gcc / make - How to define dependencies to generate and compile assembly (.s) files? [duplicate]gcc / make - 如何定义依赖项以生成和编译程序集(.s)文件? [复制]
【发布时间】:2017-01-15 14:05:41
【问题描述】:

我正在尝试编写一个生成程序集文件的 makefile (通过使用 -S 标志调用 gcc),然后修改生成的 s.-files 然后编译它。为了找到一种方法,我做了一个简短的样本 当我准确列出 .s-sourcefiles 的名称(main.s、mod1.s 等)时,makefile 可以正常工作。

    objects = main.o mod1.o
    assembly = main.s mod1.s

    app : $(objects)
        gcc -o app $(objects)
        chmod +x app
    %.s : %.c
        gcc -S $<
    #   here some code will be called to modify 
    #   the .s file for some experimental purpose ..    
    main.o : main.s
        gcc -c main.s
    mod1.o : mod1.s
        gcc -c mod1.s
    cleanobj :
        rm app $(objects)
    cleanass :
        rm $(assembly)
    cleanall : cleanobj cleanass

这按预期工作。 但是当我定义依赖时 更通用一点(“%.o : %.s”) 不再生成程序集 (.s) 文件:

    objects = main.o mod1.o
    assembly = main.s mod1.s

    app : $(objects)
        gcc -o app $(objects)
        chmod +x app
    %.s : %.c
        gcc -S $<
    #   here some code will be called to modify 
    #   the .s file for some experimental purpose ..
    %.o : %.s
        gcc -c $<
    cleanobj :
        rm app $(objects)
    cleanass :
        rm $(assembly)
    cleanall : cleanobj cleanass

任何解释,即想法如何实施这些步骤?

【问题讨论】:

    标签: gcc makefile compilation


    【解决方案1】:

    您需要将汇编文件标记为珍贵:

    .PRECIOUS: %.s
    

    或者只是标记添加以下以强制保留所有中间输出:

    .SECONDARY:
    

    另见this question

    【讨论】:

    • 感谢您的回答,但没有成功。这不是关于中间删除文件,而是首先不生成文件。这是第一个的输出:gcc -S main.c gcc -c main.s gcc -S mod1.c gcc -c mod1。 s gcc -o app main.o mod1.o 和第二个 makefile: cc -c -o main.o main.c cc -c -o mod1.o mod1.c gcc -o app main.o mod1.o 看起来像。我根本不会生成 s 文件。
    • 好的,我可以复制了。似乎我们遇到了以下情况:“其先决条件实际存在或被提及的规则始终优先于具有必须通过链接其他隐式规则来实现的先决条件的规则”(来自here)。所以你的规则被隐式规则覆盖。您可以通过 make 的 -r 标志禁用隐式规则。
    【解决方案2】:

    非常感谢 yugr,-r 标志是相关的提示! 对于任何挣扎于相同行为的人: 以下 makefile(与上述相比,已添加 .PRECIOUS: %.s)产生所需的输出(.s 和 .o 文件):

        objects = main.o mod1.o
        assembly = main.s mod1.s
    
        .PRECIOUS: %.s
        app : $(objects)
            gcc -o app $(objects)
            chmod +x app
        %.s : %.c
            gcc -S $<
        #   here some code will be called to modify 
        #   the .s file for some experimental purpose ..
        %.o : %.s
            gcc -c $<
        cleanobj :
            rm app $(objects)
        cleanass :
            rm $(assembly)
        cleanall : cleanobj cleanass
    

    产生,被调用

        make
        cc    -c -o main.o main.c
        cc    -c -o mod1.o mod1.c
        gcc -o app main.o mod1.o
        chmod +x app
    

    但是当用

    调用时
        make -r
        gcc -S main.c
        gcc -c main.s
        gcc -S mod1.c
        gcc -c mod1.s
        gcc -o app main.o mod1.o
        chmod +x app
    

    即。创建了所需的 .s 文件,同时生成了一个可执行的“应用程序”。

    请注意,目标文件夹中不存在 .o 或 .s 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-03
      • 2019-03-19
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多