在c中链接具有多个主要function的文件
是否可以使用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
内容。
这将特定于您使用的链接器。 在Linux上,您可以将--allow-multiple-definition
标志传递给链接器,以便在多个定义的情况下仅使用第一个符号:
${PROGRAM}: ${FILES.o} ${CC} -Xlinker --allow-multiple-definition -o $@ ${CFLAGS} $(INC) $^ ${LDFLAGS} ${LDLIBS}
这将省略有关重复符号的所有错误,并导致链接器忽略任何重新定义。 确保包含您要使用的符号的目标文件出现在列表中的任何重新定义之前。
简短的答案……不……这是不可能的
首先,我建议您重构代码,这样您就不会有与主函数在同一文件中的许多程序使用的函数。
无论如何,这里是一个关于如何使用预处理器仅包含一个主要function的示例。
我们有两个源代码文件,它们都带有一个main函数和另一个函数,file1.c中的foo()和file2.c中的bar()。 从两个主要函数调用foo()和baa()。
通过更改Makefile中的MAIN_ALT值,我们可以在主要function之间切换:
使用file1.c中的main函数:
DEFINES += -DMAIN_ALT=1
使用file2.c中的main函数:
DEFINES += -DMAIN_ALT=2
Makefile文件:
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