如何链接来自同时具有“主”的.cpp源文件的函数?

时间:2010-06-20 17:11:24

标签: c++ gcc linker main multiple-definition-error

我想使用.cpp源文件中的一些函数,该文件在我的.cpp源文件中有一个main函数。 (我正在使用make和gcc构建。)

这是我的Makefile中的规则:

$(CXX) $(CXXFLAGS) $(INCLUDES) $(SRCS) $(LIBS) -o $@

这是输出(更改了一些名称以防止分心):

$ make foo
g++ -g -Wall -m32 -Ilinux/include foo.cpp bar.cpp -o foo
/tmp/ccJvCgT3.o: In function `main':
/home/dspitzer/stuff/bar.cpp:758: multiple definition of `main'
/tmp/ccUBab2r.o:/home/dspitzer/stuff/foo.cpp:68: first defined here
collect2: ld returned 1 exit status
make: *** [foo] Error 1

如何向gcc表明我想使用foo.cpp中的main?

更新:我应该补充说“bar.cpp”是“别人的”代码,并且有自己的主要原因。 (听起来我应该与其他人合作让他将共享功能拆分成一个单独的文件。)

4 个答案:

答案 0 :(得分:5)

你可以做的是将每个main()函数包装在#ifdef块中,然后使用命令行来定义将导致使用相关main的符号。

#ifdef USE_MAIN1
int main(void)
{

}
#endif

然后确保gcc命令行添加了这样的内容

-DUSE_MAIN1

或者只是重新构建代码!

答案 1 :(得分:2)

这不是关于哪个main用作“主要”,因为你甚至不会那么远。

您不能重新定义函数,它会违反单一定义规则。以同样的方式做不到:

void foo(void)
{
    // number one
}

void foo(void)
{
    // number two
}

// two foo's? ill-formed.

您无法尝试编译多个main。你需要删除其他的。

答案 2 :(得分:1)

最简单的方法是删除第二个主要(...){...},并保留其余的功能。这很容易解决问题

答案 3 :(得分:1)

  

听起来我应该与其他人合作让他将共享功能拆分为单独的文件

确切地说,那是最好的选择。如果您需要单独的main进行测试,不同产品或其他原因,请将常用代码和main分解为单独的文件,并根据某些构建设置仅使用您需要的代码。