clion中运行多个c++文件

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。也可以使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值