赞
踩
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 是否生效
- double foo = -0.0;
- double bar = 0.0;
- 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 和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_FLAGS
和 CMAKE_EXE_LINKER_FLAGS
在 CMake 中,CMAKE_CXX_FLAGS
和 CMAKE_EXE_LINKER_FLAGS
都是用于设置编译选项和链接器选项的变量。
CMAKE_CXX_FLAGS
是 C++ 编译器的参数,它会影响到编译过程中的预处理、编译、汇编等各个阶段。这个变量主要用于设置编译器参数,例如开启特定的警告、启用优化、指定标准等。
CMAKE_EXE_LINKER_FLAGS
是链接器的参数,它会影响到链接阶段,确定可执行文件的构建方式。这个变量主要用于设置链接器参数,例如指定库文件搜索路径、添加依赖库等。
需要注意的是,CMAKE_CXX_FLAGS
和 CMAKE_EXE_LINKER_FLAGS
通常会分别作用于不同的阶段,使用它们时需要注意各自的作用范围。
通常情况下,我们可以将编译器选项和链接器选项分别设置,以便更加清晰地控制编译和链接的行为。例如:
- # 设置编译器参数
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -O2")
-
- # 设置链接器参数
- 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 属性指定的路径去查找共享库
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。