clion中运行多个c++文件
一、运行多个c++文件
方法一:使用hpp文件
1,main.cpp(主函数入口文件)
#include <iostream>
#include "i.hpp"
int main() {
std::cout << "Hello, World!" << std::endl;
p();
return 0;
}
2,i.hpp
(这里用hpp是因为实现和头文件一起了所以选择用hpp格式,一般是.h文件和.cpp文件分开写)
#include <iostream>
using namespace std;
void p() {
cout << "i.hpp!" << endl;
}
3,CMakeLists.txt
# cmake_minimum_required(VERSION <specify CMake version here>)
project(test)
set(CMAKE_CXX_STANDARD 11)
add_executable(test1 main.cpp i.hpp)
编译运行输出结果:
D:\CLion\workspace\test\cmake-build-debug\test1.exe
Hello, World!
i.hpp!
这里如果i.hpp改成i.cpp会报下面的错误
====================[ Build | test1 | Debug ]===================================
"D:\CLion\CLion 2018.3.4\bin\cmake\win\bin\cmake.exe" --build D:\CLion\workspace\test\cmake-build-debug --target test1 -- -j 2
-- Configuring done
-- Generating done
-- Build files have been written to: D:/CLion/workspace/test/cmake-build-debug
Scanning dependencies of target test1
[ 33%] Building CXX object CMakeFiles/test1.dir/i.cpp.obj
[ 66%] Linking CXX executable test1.exe
d:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: CMakeFiles\test1.dir/objects.a(i.cpp.obj): in function `Z1pv':
D:/CLion/workspace/test/i.cpp:7: multiple definition of `p()'; CMakeFiles\test1.dir/objects.a(main.cpp.obj):D:/CLion/workspace/test/t.hpp:75: first defined here
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [test1.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/test1.dir/all] Error 2
CMakeFiles\test1.dir\build.make:99: recipe for target 'test1.exe' failed
CMakeFiles\Makefile2:71: recipe for target 'CMakeFiles/test1.dir/all' failed
CMakeFiles\Makefile2:83: recipe for target 'CMakeFiles/test1.dir/rule' failed
mingw32-make.exe[1]: *** [CMakeFiles/test1.dir/rule] Error 2
mingw32-make.exe: *** [test1] Error 2
Makefile:117: recipe for target 'test1' failed
本以为是有多个p函数定义,但这里实际上是因为文件内容后缀不对,将i.cpp改成i.hpp即可
如果是报main函数多定义可能就是两个文件都有main函数,如果希望一个项目project生成多个可执行的程序,这时可以通过在CMakeLists.txt中多添加add_executable来实现,如下所示,win下编译最后会生成两个可执行程序,test1.exe和test2.exe
project(test)
set(CMAKE_CXX_STANDARD 11)
add_executable(test1 main.cpp i.h)
add_executable(test2 equal_range_map.cpp)
方法二:将i.hpp分割成i.h和i.cpp两个文件
1,i.h
#ifndef TEST_I_H
#define TEST_I_H
void p();
#endif //TEST_I_H
2,i.cpp
#include <iostream>
using namespace std;
void p() {
cout << "i.cpp!" << endl;
}
3,main.cpp(主函数入口文件)
#include <iostream>
#include "i.h" // 改变地方
int main() {
std::cout << "Hello, World!" << std::endl;
p();
return 0;
}
4,CMakeLists.txt
# cmake_minimum_required(VERSION <specify CMake version here>)
project(test)
set(CMAKE_CXX_STANDARD 11)
add_executable(test1 main.cpp i.h i.cpp) # 重点改变
编译运行后输出结果
D:\CLion\workspace\test\cmake-build-debug\test1.exe
Hello, World!
i.cpp!
方法三:
为了少写一些具体的文件名字,可以在CMakeLists.txt里面使用下面的方法
CMakeLists.txt
project(test)
set(CMAKE_CXX_STANDARD 11)
file(GLOB SOURCES
*.h
*.cpp
) # 搜索当前目录下的.h和.cpp文件,不会深入到子目录
# file(GLOB_RECURSE SOURCES
# *.h
# *.cpp
# ) # 搜索当前目录所有的.h和.cpp文件
add_executable(test1 main.cpp ${SOURCE_FILES} ${SOURCES})
二、debug模式运行c++程序
cmake_minimum_required(VERSION 3.5)
project(test)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -std=c++0x -fPIC -fopenmp -Wall -Wno-sign-compare")
SET(CMAKE_BUILD_TYPE "Debug") # Debug或者Release
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O3 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
file(GLOB_RECURSE srcs ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) # 查找${CMAKE_CURRENT_SOURCE_DIR}/src/目录下以cpp结尾的文件
add_executable(cpptest ${srcs})
# SET(CPPTEST_LIB_PATH 对应的.so路径)
# target_link_libraries(cpptest ${CPPTEST_LIB_PATH})
CMAKE_BUILD_TYPE
CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile ,当这个变量值为 Release 的时候,工程会使用变量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 选项生成 Makefile。也可以使用