cmake链接错误2

时间:2018-03-30 10:59:42

标签: c++ cmake

我正在尝试使用cmake编译一个简单的代码,我收到一个错误。代码和cmake文件如下。 test.cpp是我直接包含test1.cpp的主文件。我还包含了我的CMake文件以及我在执行make时遇到的错误。

TEST.CPP

#ifndef _IOSTREAM_
#include<iostream>
#endif
#include"test1.cpp"
using namespace std;
int main()
{
printing("hello");
return 0;
}

test1.cpp

#ifndef _IOSTREAM_
#include<iostream>
#endif
#include<string>
using namespace std;
void printing(string s)
{
cout<<s<<endl;
return;
}

的CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
set(CMAKE_C_COMPILER "/usr/bin/clang")
set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
project(test)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++11)
add_executable(test test.cpp test1.cpp)

错误

CMakeFiles/test.dir/test1.cpp.o: In function 
printing(std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> >):
/home/vatsal/Desktop/test/test1.cpp:(.text+0x0): multiple definition 
of printing(std::__cxx11::basic_string<char, std::char_traits<char>, 
std::allocator<char> >)
CMakeFiles/test.dir/test.cpp.o:/home/vatsal/Desktop/test/test.cpp: 
(.text+0x0): first defined here
clang: error: linker command failed with exit code 1 (use -v to see 
invocation)
CMakeFiles/test.dir/build.make:98: recipe for target test failed
make[2]: *** [test] Error 1
CMakeFiles/Makefile2:67: recipe for target CMakeFiles/test.dir/all 
failed
make[1]: *** [CMakeFiles/test.dir/all] Error 2
Makefile:83: recipe for target all failed
make: *** [all] Error 2

1 个答案:

答案 0 :(得分:0)

这是因为包含cpp文件是一个坏主意。

在预处理器工作之后,您将获得void printing(string s)的两个辩护,第一个位于test.cpp,因为您已经发送test1.cpp而第二个位于test1.cpp

解决方案是创建包含函数声明的test1.h

#include<iostream>
#include<string>
using namespace std;
void printing(string s);

然后修复test1.cpp:

#include "test1.h"
using namespace std;
void printing(string s)
{
    cout<<s<<endl;
    return;
}

最后用#include"test1.cpp"

中的#include"test1.h"替换test.cpp