带有cmake的架构x86_64的1个重复符号

时间:2016-12-18 03:27:33

标签: c++

我正在尝试使用mac上的cmake编译测试类。当我运行cmake并生成命令时,我最终得到了这个错误:

duplicate symbol _main in:
    CMakeFiles/Carm.dir/CMakeFiles/3.7.0/CompilerIdCXX/CMakeCXXCompilerId.cpp.o
    CMakeFiles/Carm.dir/test.cpp.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [Carm] Error 1
make[1]: *** [CMakeFiles/Carm.dir/all] Error 2
make: *** [all] Error 2

告诉我主要有一个重复的符号。当我单独使用g ++时,这段代码可以很好地编译。

car.h

#ifndef CAR_H
#define CAR_H

#include <string>

using namespace std;

namespace test {
    class Car {
    private:
            string model;
            int hp;
            int speed;

    public:
            Car(string n_model, int n_hp);
            string getModel();
            int getHp();
            int getSpeed();

    };
}
#endif

car.cpp

#include "car.h"

using namespace test;

Car::Car(string n_model, int n_hp) {
        model = n_model;
        hp = n_hp;
        speed = 0;
}

string Car::getModel() {
        return model;
}

int Car::getHp() {
        return hp;
}

int Car::getSpeed() {
        return speed;
}

TEST.CPP

#include "car.h"
#include <cstdio>

using namespace std;
using namespace test;

int main() {
        Car car1("BMW", 400);
        Car car2("Hellcat", 707);

        printf("hp-%d speed-%d\n", car1.getHp(), car1.getSpeed());
        printf("hp-%d speed-%d\n", car2.getHp(), car2.getSpeed());

        return 0;
}

这是我的CMakeLists.txt文件

cmake_minimum_required(VERSION 2.8)

project(Carm)

file(GLOB_RECURSE Carm_SOURCES "*.cpp")
file(GLOB_RECURSE Carm_HEADERS "*.h")

set(Carm_INCLUDE_DIRS "")
foreach(_headerFile ${Carm_HEADERS})
        get_filename_component(_dir ${_headerFile} PATH)
        list(APPEND Carm_INCLUDE_DIRS ${_dir})
endforeach()
list(REMOVE_DUPLICATES Carm_INCLUDE_DIRS)

include_directories(${Carm_INCLUDE_DIRS})
add_executable(Carm ${Carm_SOURCES})

1 个答案:

答案 0 :(得分:6)

在您的可执行文件中,您有两个主要功能(按Carm_SOURCES打印MESSAGE(${Carm_SOURCES}))。一个在test.cpp中,一个在CMakeCXXCompilerId.cpp中(这是CMake生成的文件)测试你的CXX编译器是否正常工作。GLOB_RECURSE找到并将这两个文件添加到Carm_SOURCES

建议不要使用GLOB来收集源文件列表。从文件(GLOB文档:

  

我们不建议使用GLOB从您的收集源文件列表   源树。如果在添加或删除源时没有更改CMakeLists.txt文件   然后生成的构建系统无法知道何时要求CMake重新生成。

列出项目文件的推荐方法是手动将它们添加到CMakeLists.txt