在c中链接具有多个主要功能的文件

时间:2014-03-26 15:09:50

标签: c linker makefile

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

e.g:  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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:-1)

答案简短......不......这是不可能的

答案 2 :(得分:-1)

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

无论如何,这里有一个关于如何使用预处理器只包含一个主要功能的例子。

我们有两个源代码文件,它们都带有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