C ++编译错误:“main”的多重定义,但项目中只有1个主要功能

时间:2017-01-05 21:47:44

标签: c++ compilation cmake googletest

我在lib上工作,并根据gtest框架对它进行单元测试。因此,单元测试的设置编译正常。然而,当我尝试一些不同的设置来测量代码覆盖率时,编译失败并出现此错误:

[ 10%] Linking CXX executable coverageRun.exe
CMakeFiles/coverageRun.dir/tests/src/main.cpp.o: In function `main':
/cygdrive/d/code/tests/src/main.cpp:24: multiple definition of `main'
CMakeFiles/coverageRun.dir/CMakeFiles/3.6.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o:/cygdrive/d/code/cmake-build-debug/CMakeFiles/3.6.3/CompilerIdCXX/CMakeCXXCompilerId.cpp:514: first defined here
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/coverageRun.dir/build.make:1215: coverageRun.exe] Error 1
make[2]: *** [CMakeFiles/Makefile2:101: CMakeFiles/coverageRun.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:113: CMakeFiles/coverageRun.dir/rule] Error 2
make: *** [Makefile:175: coverageRun] Error 2

这就是我的main.cpp文件的样子:

#include <iostream>
#include <gtest/gtest.h>
#include "helpers/helper.h"
#include "helpers/pathHelper.h"

namespace code{

            bool isPreconditionsOK(){
                auto testRoot = helper::readEnvVar(helper::path::TEST_ROOT);
                bool result = true;
                if(testRoot.empty()){
                    std::cerr << "Env. variable " << helper::path::TEST_ROOT
                                       << " should be set before test start." << std::endl;
                    result = false;
                }
                return result;
            }
}


int main(int argc, char **argv) {
    if(code::isPreconditionsOK()){
        testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    };
}

那么我可以尝试解决这个问题呢?

“CmakeCxxCompilerId.cpp”的样子如下:link

3 个答案:

答案 0 :(得分:5)

我假设您在顶级目录中使用file(GLOB_RECURSE...来获取项目的源列表。这种方法非常危险,你现在真的可以看到它,因为你遇到了麻烦。但是作为解决方法尝试这样的事情:

file(GLOB_RECURSE REMOVE_CMAKE "cmake-build-debug/*")
list(REMOVE_ITEM your_list_of_sources ${REMOVE_CMAKE})

这将解决您当前的问题,但您需要重新思考一般方法以避免将来出现类似的故事。

因为正确知道你在目录和编译器中搜索所有源代码,只需找到2个主要函数,这在C ++世界中是不允许的。我提供的代码片段只是从编译中删除了cmake-build-debug文件夹中的代码。

答案 1 :(得分:2)

https://public.kitware.com/Bug/view.php?id=11043 使用这样的东西:

FILE(GLOB TARGET_H "${CMAKE_SOURCE_DIR}/*.h")
FILE(GLOB TARGET_CPP "${CMAKE_SOURCE_DIR}/*.cpp")
SET(TARGET_SRC ${TARGET_CPP} ${TARGET_H})
...

如果一个人将使用GLOB_RECURSE,它还会检查CMakeFiles文件夹以及里面的内容。它将找到cmake生成的主要函数的cpp文件,这会导致&#34; main&#34;的多重定义。功能

答案 2 :(得分:1)

CMake必须在项目中找到另一个* .cpp文件,其中包含一个main()。你应该修改cmake构建项目。 请检查此cmake finds more than one main function