当前位置:   article > 正文

centos cmake 支持c17_cmake c++17

cmake c++17

1. 升级gcc 到8版本以上

2.add_definitions(-std=c++17)

以下例子:

cmake_minimum_required(VERSION 3.17)
project(testJemalloc3)

set(CMAKE_CXX_STANDARD 17)


add_executable(testJemalloc3 main.cpp)

add_definitions(-std=c++17)
3. 进入到工程目录

set(CMAKE_CXX_COMPILER "/usr/bin/g++")

或者

cmake -DCMAKE_CXX_COMPILER=/path/to/your/g++ .

4. 设置 编译目录

在项目根目录运行编译命令并指定生成文件目录:

cmake -B cmake-build-debug

5.///其实就是三步///

1. cmake -DCMAKE_CXX_COMPILER=/usr/bin/g++ . -B cmake-build-debug

        clion 多项目下

cd到主目录luagame下

 cmake -DCMAKE_CXX_COMPILER=/usr/bin/g++ . -B cmake-build-debug

下面的可能会用到

cmake -DCMAKE_CXX_COMPILER=/usr/bin/g++ game -B ../cmake-build-debug/game

2.set(CMAKE_CXX_COMPILER "/usr/bin/g++")

3. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -g -O3")

4. 判断c++20 是否生效

  1. double foo = -0.0;
  2. double bar = 0.0;
  3. auto res = foo <=> bar;

能编译过就行

判断c++17 是否生效, string_view 能编译过就行

//end/

6. 设置文件输出目录,可执行文件输出目录

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

这里有个很重要的坑:设置的时候要放在add_executable、add_library前面

cmake 引用第三方库<1> 直接引用源码  <2> 把源码编译进程序, <3>引用.a 和.so 文件的例子
cmake调用第三方库 | 程序员灯塔

7.

include_directories - 向工程添加多个特定的头文件搜索路径 ----相当于指定g++编译器的-I参数
语法: include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径
include_directories(/usr/include/myincludefolder ./include)
link_directories - 向工程添加多个特定的库文件搜索路径 —>相当于指定g++编译器的-L参数
语法: link_directories(dir1 dir2 ...)

# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib)

add_library - 生成库文件
语法: add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)

# 通过变量 SRC 生成 libhello.so 共享库
#set(SRC sayhello.cpp hello.cpp)
add_library(hello SHARED ${SRC})

add_compile_options - 添加编译参数
语法:add_compile_options()

# 添加编译参数 -Wall -std=c++11
add_compile_options(-Wall -std=c++11 -O2)

# 添加命令行
add_compile_options(-bigobj)
add_executable - 生成可执行文件
语法:add_executable(exename source1 source2 ... sourceN)

# 编译main.cpp生成可执行文件main
add_executable(main main.cpp)

target_link_libraries - 为 target(目标) 添加需要链接的共享库 —>相同于指定g++编译器-l参数
语法: target_link_libraries(target library1<debug | optimized> library2...)

# 将hello动态库文件链接到可执行文件main
#add_library(hello SHARED ${SRC})
target_link_libraries(main hello)

add_subdirectory - 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置

语法: add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

# 添加src子目录,src中需有一个CMakeLists.txt
add_subdirectory(src)

aux_source_directory - 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指
令临时被用来自动构建源文件列表
语法: aux_source_directory(dir VARIABLE)

# 定义SRC变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)
# 编译SRC变量所代表的源代码文件,生成main可执行文件
add_executable(main ${SRC})
 

CMake常用变量
CMAKE_C_FLAGS gcc编译选项
CMAKE_CXX_FLAGS g++编译选项

# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
 
CMAKE_BUILD_TYPE 编译类型(Debug, Release)

# 设定编译类型为debug,调试时需要选择debug
set(CMAKE_BUILD_TYPE Debug)
# 设定编译类型为release,发布时需要选择release
set(CMAKE_BUILD_TYPE Release)

CMAKE_BUILD_TYPE在命令行里是有效的,但是如果是VS IDE和Xcode IDE其实是无效的在VS IDE和Xcode里,用的是CMAKE_CONFIGURATION_TYPES
默认顺序是:CMAKE_CONFIGURATION_TYPES:STRING=Debug;Release;MinSizeRel;RelWithDebInfo
所以,每次编译时,默认是Debug。如果要修改默认顺序,需要调整CMAKE_CONFIGURATION_TYPES中的顺序。

参考: cmake小发现 - 知乎

cmake 和g++命令的详解

g++编译参数---CMake详细使用教程---Linux--基于VSCode和CMake实现C/C++开发--笔记_方池安夏的博客-CSDN博客_cmake g++



cmake 设置release模式

set(CMAKE_BUILD_TYPE Release )

或者

mkdir Release  
cd Release  
cmake -DCMAKE_BUILD_TYPE=Release ..  
make  

什么情况下可以开release模式呢?
机器性能够的话都可以跑
release跑的话性能高点。

服务器没有稳定之前机器又比较好就跑debug。
 

常用变量

PROJECT_SOURCE_DIR:工程的根目录

PROJECT_BINARY_DIR:运行cmake命令的目录,通常为${PROJECT_SOURCE_DIR}/build

PROJECT_NAME:返回通过 project 命令定义的项目名称

CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的路径

CMAKE_CURRENT_BINARY_DIR:target 编译目录

CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路径

EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置

LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置

make clean

make 

libcurl ,,配置

set(CURL_LIBRARY "-lcurl")

find_package(CURL REQUIRED)

include_directories(${CURL_INCLUDE_DIR})

target_link_libraries(main ${CURL_LIBRARIES})

添加宏  -D用于定义宏 #define

1. add_definitions(-DDEBUG)

   add_definitions(-DMY_MACRO=123)

2. 对于库

add_library(mylib mylib.cpp)

target_compile_definitions(mylib PRIVATE -DDEBUG)

  • PRIVATE:宏定义仅对当前目标有效,不会传递给依赖的其他目标。
  • PUBLIC:宏定义对当前目标及其所有依赖的目标都有效。
  • INTERFACE:宏定义仅对依赖当前目标的其他目标有效,不会影响当前目标自身。

CMAKE_CXX_FLAGSCMAKE_EXE_LINKER_FLAGS

在 CMake 中,CMAKE_CXX_FLAGSCMAKE_EXE_LINKER_FLAGS 都是用于设置编译选项和链接器选项的变量。

CMAKE_CXX_FLAGS 是 C++ 编译器的参数,它会影响到编译过程中的预处理、编译、汇编等各个阶段。这个变量主要用于设置编译器参数,例如开启特定的警告、启用优化、指定标准等。

CMAKE_EXE_LINKER_FLAGS 是链接器的参数,它会影响到链接阶段,确定可执行文件的构建方式。这个变量主要用于设置链接器参数,例如指定库文件搜索路径、添加依赖库等。

需要注意的是,CMAKE_CXX_FLAGSCMAKE_EXE_LINKER_FLAGS 通常会分别作用于不同的阶段,使用它们时需要注意各自的作用范围。

通常情况下,我们可以将编译器选项和链接器选项分别设置,以便更加清晰地控制编译和链接的行为。例如:

  1. # 设置编译器参数
  2. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -O2")
  3. # 设置链接器参数
  4. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/path/to/libs -lmylib")

在上述示例中,CMAKE_CXX_FLAGS 设置了编译器参数,包括指定 C++ 标准、开启警告、启用优化等。CMAKE_EXE_LINKER_FLAGS 则设置了链接器参数,包括指定库文件搜索路径、链接库文件等。

 常情况下,设置 rpath 属性应该使用 CMAKE_EXE_LINKER_FLAGS 变量,因为它是与链接器有关的选项。

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,/path/to/libs")

如果只是需要在编译时将库路径添加到搜索路径中,而不需要修改 rpath 属性,可以使用 CMAKE_CXX_FLAGS 变量。例如:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L/path/to/libs")

rpath 属性:rpath 是可执行文件中的一个属性,用于指定运行时链接器在程序启动时查找共享库的路径。rpath 属性可以在编译时将共享库的路径硬编码到可执行文件中,以便在程序运行时直接从指定路径加载共享库

库搜索路径:库搜索路径是在编译和链接阶段使用的选项,用于告诉编译器和链接器在编译和链接过程中如何搜索共享库。通过设置库搜索路径,可以让编译器和链接器能够正确地找到所需要的共享库文件。库搜索路径的设置通常是通过编译选项(如 -L)或者环境变量(如 LD_LIBRARY_PATH)来实现的
就性能而言,设置库搜索路径相对来说更高效一些。rpath 属性在可执行文件中硬编码了共享库的路径,这意味着每次执行程序时,运行时链接器都会按照 rpath 属性指定的路径去查找共享库

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/626644
推荐阅读
相关标签
  

闽ICP备14008679号