【问题标题】:How do I link in functions from a .cpp source file that also has a 'main'?如何从也有“main”的 .cpp 源文件中链接函数?
【发布时间】:2011-03-06 01:00:03
【问题描述】:

我想使用 .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”是“别人的”代码,并且有它自己的理由。 (听起来我应该与其他人合作,让他将共享函数拆分为单独的文件。)

【问题讨论】:

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


    【解决方案1】:

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

    #ifdef USE_MAIN1
    int main(void)
    {
    
    }
    #endif
    

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

    -DUSE_MAIN1
    

    或者只是重构你的代码!

    【讨论】:

    • 如果他可以修改代码以放入编译器宏,那么他可以修改代码以将他想要的函数拆分到一个单独的文件中,并让链接器完成它的工作。这样他就不会用不需要的main 弄乱自己的代码库,也不会用无意义的#ifndef 污染其他人的代码。
    • 答案是在 OP 表示无法进行修改之前编写的。我同意这并不理想,但它回答了如何编译和链接定义相同函数的两个文件的问题。
    • 我会接受这个答案,因为它让我现在可以“快速而肮脏”地解决问题,然后再与其他工程师一起正确解决问题。
    【解决方案2】:

    这与将哪个main 用作您的“主要”无关,因为您甚至不会走那么远。

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

    void foo(void)
    {
        // number one
    }
    
    void foo(void)
    {
        // number two
    }
    
    // two foo's? ill-formed.
    

    您不能尝试编译多个main。您需要删除其他的。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        没错,这是最好的选择。如果你们都需要单独的mains 进行测试、不同的产品或其他原因,请将常用代码和mains 放在单独的文件中,并根据某些构建设置仅使用您需要的代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-12
          • 2015-01-30
          • 2012-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          • 2019-11-09
          相关资源
          最近更新 更多