Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

CLion知识集锦

13
Jan
2016

CLion知识集锦

By Alex
/ in C,C++
/ tags IntelliJ
0 Comments
简介

CLion是基于Intellij平台的IDE,主要用于C/C++开发。它使用CMake工程模型,你对CMakeLists.txt的任何更改都会反映到IDE中,CLion调用CMake的命令行完成工程构建。

基础
全局设置
设置路径 说明
B,E,D ⇨ Toolchains 工具链设置,可以指定CMake、GDB的路径,在Windows下你还可以指定MinGW或者Cygwin的安装位置
B,E,D ⇨ CMake

勾选Automatically Reload CMake project on editing

Generation

CMake Options,指定传递给cmake命令行的选项,例如通过 -Dvar=name 传递变量值

展开Pass System Environment,可以覆盖系统环境变量。勾选Pass system environment variables可以传递系统环境变量到CMake的Generation阶段

和CMake协同

当通过CLion创建新工程时,CMakeLists.txt会自动创建。当工程结构复杂时,你可以手工为子目录创建CMakeLists.txt文件。

当你打开不是基于CMake的工程时,CLion允许做的事情很少——不能编辑代码、不能构建或运行。这种情况下你可以使用CMake的导入功能或者手工创建CMakeLists.txt文件。

手工修改CMakeLists.txt后,需要Reload工程才能体现出修改。当需要Reload时CMake工具窗口会有提示。你还可以启用Auto-Reload。

重置CMake缓存

如果需要在构建前清空CMake的缓存条目,可以定位到CMake工具窗口 ⇨ Cache选项卡,点击Selection_006按钮。

修改构建配置

点击Selection_007右侧的向下箭头,选择Edit Configurations,可以修改某个条目使用的构建配置,默认支持CMake的四种构建配置。

你可以在CMakeLists.txt中添加自定义的构建配置:

CMakeLists.txt
1
2
# 必须是第一个变量定义
set(CMAKE_CONFIGURATION_TYPES "CustomType1;CustomType2" CACHE STRING "" FORCE)
修改工程根目录

打开既有CMake工程或者创建新工程后,默认的CLion把CMakeLists.txt所在目录作为工程根目录(Project root directory)看待,要改变此行为,可以Tools ⇨ CMake ⇨ Change Project Root。

CMakeLists.txt基本命令
命令 说明
include_directories

指定头文件的搜索位置。头文件不但对编译是必须的,也可以被CLion索引,以提供代码自动完成、代码导航

依据操作系统的不同,编译器会自动搜索一些预定义的位置,你可以可以手工添加:

1
2
# 可选的BEFORE/AFTER关键字用于控制搜索顺序
include_directories(BEFORE ${MY_SOURCE_DIR}/src )

 

set 设置一系列变量的值:
1
2
3
4
5
6
7
8
# 设置C编译器的位置
set (CMAKE_CXX_COMPILER, "C:\\MinGW\\bin\\g++")
# 启用C99标准
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
# 启用C++ 11标准
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# 启用警告
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
add_executable 添加可执行的构建目标
add_library 添加库:
1
add_library (my_library STATIC|SHARED|MODULE ${SOURCE_FILES})
target_link_libraries 包含链接所需的库:
1
2
3
4
5
6
7
8
9
10
# 使用BOOST库
find_package(Boost)
IF (Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIR})
endif()
set (Boost_USE_STATIC_LIBS OFF) # enable dynamic linking
set (Boost_USE_MULTITHREAD ON)  # enable multithreading
find_package (Boost COMPONENTS REQUIRED chrono filesystem)
# 声明链接到BOOST库
target_link_libraries (my_target ${Boost_LIBRARIES})
add_subdirectory

用于包含子工程。

一个工程可以依赖于其它工程,CMake没有类似于VS的解决方案(Solution)的概念,但是它允许你手工定义工程之间的依赖关系

典型的,你希望在工作区中这样管理多工程(Multi-project)结构:

  1. 打开主工程时,其依赖的工程一并打开
  2. 主工程的设置自动应用到被依赖的工程
  3. 重构、代码完成等可以影响到所有工程

上面的三点需求可以通过合适的CMakeList.txt完成,你需要把上述所有工程组织到CMakeList.txt所在目录之下,形成树形结构,每个子目录对应一个子工程,并且子目录有自己的CMakeLists.txt。最后,在根目录的CMakeLists.txt中添加:

1
2
add_subdirectory (project1) # 把project1包含到主工程
add_subdirectory (project2) # 把project2包含到主工程
调试
本地调试
Attach到进程

点击 Run ⇨ Attach to Process... 可以调试运行中的进程。当Debug工具窗口提示Debugger attached to process ...后,点击左侧的Pause Program按钮,这时GDB窗格支持输入。

你可能需要设置源码搜索路径,否则设置断点时GDB窗格提示No source file named /home/alex/CPP/project ...要设置源码搜索路径,在GDB窗格中输入set directories命令,示例:

Shell
1
set directories /home/alex/CPP/projects/clion/envoy
启动并调试程序

你可以启动任意应用程序并调试,此程序不一定是CLion通过Cmake构建出来的。

点击 Run ⇨ Edit Configurations,添加一个Application类型的配置,Executable选择你需要调试的应用程序的绝对路径:

run-debug-configurations

注意:把Before launch下面的Build项去掉。

然后点击调试按钮即可。

远程调试
启动gdbserver

脚本示例:

Shell
1
2
#!/usr/bin/env bash
gdbserver --once localhost:2345 envoy ...
Clion配置

配置示例截图:

run-debug-configuration-remote

路径映射

基于gdbserver进行远程调试时,特别需要注意路径映射的问题。

Remote端使用(符号表中的)相对路径貌似无效,确定决定路径,可以按照如下步骤:

  1. 使用gdb连接到gdbserver:
    Shell
    1
    (gdb) target remote localhost:2345
  2. 打印源码列表:

    Shell
    1
    2
    3
    4
    (gdb) info sources
    /proc/self/cwd/source/exe/main_common.cc ...
    /proc/self/cwd/bazel-out/k8-dbg/bin/include/envoy/common ...
    /home/alex/.cache/bazel/_bazel_alex/3a80e9c345550f05d77beb52ded4f5f3/external/envoy_deps_cache_2c744dffd279d7e9e0910ce594eb4f4f/libevent.dep.build/libevent-release-2.1.8-stable/build/../ratelim-internal.h
  3. 通过打印当前栈追踪,查看符号表中的源码路径:

    Shell
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (gdb) where
    #0  epoll_wait (epfd=<optimized out>, events=events@entry=0x2e00a80, maxevents=<optimized out>, timeout=timeout@entry=100) at ../epoll_sub.c:66
    #1  0x00000000010b7709 in epoll_dispatch (base=0x2e70000, tv=<optimized out>) at ../epoll.c:462
    #2  0x00000000010ad8dd in event_base_loop (base=0x2e70000, flags=0) at ../event.c:1947
    #3  0x0000000000a5067c in Envoy::Event::DispatcherImpl::run (this=0x2d9d3f0, type=Envoy::Event::Dispatcher::RunType::Block) at source/common/event/dispatcher_impl.cc:165
    #4  0x00000000009d74c5 in Envoy::Server::InstanceImpl::run (this=0x2e2d200) at source/server/server.cc:466
    #5  0x0000000000425baa in Envoy::MainCommonBase::run (this=0x2e2c8b0) at source/exe/main_common.cc:103
    #6  0x000000000040cd68 in Envoy::MainCommon::run (this=0x2e2c480) at bazel-out/k8-dbg/bin/source/exe/_virtual_includes/envoy_main_common_lib/exe/main_common.h:86
    #7  0x000000000040a4bf in main (argc=19, argv=0x7fffffffd238) at source/exe/main.cc:37 
  4.  可以看到source目录对应到的是/proc/self/cwd/source目录。假设Debugger端的源码路径是/home/alex/CPP/projects/clion/envoy/source,则需要建立两者的路径映射

常见问题
如何执行安装

CLion默认指定的构建树的位置,可以在Messages窗口看到,通过CLion执行一次构建,可以看到类似:

Shell
1
bin/cmake --build /home/alex/.CLion2016.1/system/cmake/generated/sds-1b689bf9/1b689bf9/Debug --target sds -- -j 8

的消息,你只需要CD到 --build 后面跟着的目录,就可以执行 make install 进行安装了,当然前提是在CMakeLists.txt中声明合适的install命令。

调试时对象无法展开

也无法调用对象的方法、查看其字段值。

出现此问题的原因是,目标对象在编译时没有开启调试信息。如果使用GCC,尝试添加编译参数-O0 -g3。 

← Nginx知识集锦
Framework7学习笔记(二):组件 →

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • CMake学习笔记
  • IntelliJ IDEA知识集锦
  • IntelliJ平台知识集锦
  • PhpStorm知识集锦
  • Protocol Buffers初探

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • Bazel学习笔记 37 people like this
  • NaCl学习笔记 32 people like this
  • PhoneGap学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
  • Three.js学习笔记 24 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2