【问题标题】:Linking files having multiple main function in c在c中链接具有多个主要功能的文件
【发布时间】:2014-03-26 15:09:49
【问题描述】:

是否可以使用 makefile 链接两个 C 文件,它们调用彼此的函数,但都有自己的 main 函数。

例如: C1.c 使用 C2.c 中的函数 f(),但两者都有 main 函数,我希望 C1.c 中的 main 仅被视为 main

FILES.o=set.o hash.o printnfa.o input.o nfa.o dfa.o terp.o minimize.o defnext.o print_ar.o pairs.o squash.o signon.o print.o lex.o assort.o prnt.o printv.o bintoasc.o ferr.o onferr.o fputstr.o pchar.o driver.o searchenv.o hashadd.o esc.o 

PROGRAM= Lexer
INC := -I./debug.h -I./global.h -I./stack.h -I./set.h -I./hash.h
CFLAGS=-DMAIN
all: ${PROGRAM}

${PROGRAM}: ${FILES.o}
${CC} -o $@ ${CFLAGS} $(INC) $^ ${LDFLAGS} ${LDLIBS}

现在 terp.c 有一个 main,而 lex.c 也有一个 main。我只想考虑 lex.c 的 main

【问题讨论】:

  • 您可以在一个文件中围绕main 添加预处理器条件,否则会出现链接器错误(main 的多个定义)。
  • 是存在于 terp.c 文件中的内容

标签: c linker makefile


【解决方案1】:

这将特定于您使用的链接器。在 Linux 上,您可以将 --allow-multiple-definition 标志传递给链接器,以便在多个定义的情况下仅使用第一个符号:

${PROGRAM}: ${FILES.o}
${CC} -Xlinker --allow-multiple-definition -o $@ ${CFLAGS} $(INC) $^ ${LDFLAGS} ${LDLIBS}

这将忽略有关重复符号的所有错误并导致链接器忽略任何重新定义。确保包含您希望使用的符号的目标文件位于列表中的任何重新定义之前。

【讨论】:

  • /usr/bin/ld: unrecognized option '--allow-mutilple-definition'..这就是他们所显示的
  • @Paku 正如我所说,这取决于您的链接器。如果您能找到类似的选项,请查看man ld
【解决方案2】:

简短的回答......不......不可能

【讨论】:

    【解决方案3】:

    首先,我建议您重构代码,这样您就不会在同一个文件中拥有许多程序将使用的函数作为主函数。

    无论如何,这里有一个示例,说明如何使用预处理器仅包含一个主要功能。

    我们有两个源代码文件,它们都有一个 main 函数和一个其他函数,file1.c 中的 foo() 和 file2.c 中的 bar()。 foo() 和 baa() 从两个主函数中调用。

    通过更改 Makefile 中的 MAIN_ALT 值,我们可以在主要功能之间进行切换:

    使用file1.c中的main函数:

    DEFINES += -DMAIN_ALT=1
    

    使用file2.c中的main函数:

    DEFINES += -DMAIN_ALT=2
    

    生成文件:

    OBJS = file1.o file2.o
    DEFINES += -DMAIN_ALT=1
    CFLAGS += -Wall $(DEFINES)
    prog:$(OBJS) 
        $(CC) $(CFLAGS) -o $@ $^
    

    file1.c:

    #include "stdio.h"
    #include "def.h"
    
    void foo(){
        printf("From foo\n");
    }
    
    #if MAIN_ALT == 1
    int main(){
        printf("Main in file1.c\n");
        bar();
        foo();
        return 0;
    }
    #endif
    

    file2.c:

    #include "stdio.h"
    #include "def.h"
    
    void bar(){
        printf("From bar\n");
    }
    
    #if MAIN_ALT == 2
    int main(){
        printf("Main in file2.c\n");
        bar();
        foo();
        return 0;
    }
    #endif
    

    def.h:

    #ifndef __DEF_H__
    #define __DEF_H__
    void foo();
    void bar();
    #endif
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2012-07-18
      • 1970-01-01
      • 2019-01-11
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多