Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • XML
      • Ruby
      • Perl
      • Lua
      • Rust
      • Network
      • IoT
      • GIS
      • 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
      • XML
      • Ruby
      • Perl
      • Lua
      • Rust
      • Network
      • IoT
      • GIS
      • 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学习笔记
  • WebStorm知识集锦
  • IntelliJ平台知识集锦
  • PhpStorm知识集锦
  • Protocol Buffers初探

Recent Posts

  • IPVS模式下ClusterIP泄露宿主机端口的问题
  • 念爷爷
  • 杨梅坑
  • 34759
  • 2020年10月拈花湾
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
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

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

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • 彩彩 2020年6月黄崖关

  • 总部远眺 2020年5月深圳

  • 绚丽之花 寻味顺德

  • tuanbolake 团泊湖野餐

  • Istio中的透明代理问题
    为何需要透明代理 Istio的Sidecar作为一个网络代理,它拦截入站、出站的网络流量。拦截入站流量后,会使 ...
  • 重温iptables
    工作流图 下面这张图描述了一个L3的IP封包如何通过iptables:  对于此图的说明: Ipt ...
  • 从镜像中抽取文件
    动机 在某个应用场景中,我们需要在每个K8S节点上运行一个Agent,此Agent能够执行运维人员动态配置的P ...
  • 服务网格的现状和未来
    引言 服务网格(Service Mesh)是一种微服务治理基础设施,用于控制、监测微服务之间的东西向流量。它通 ...
  • 如何在Pod中执行宿主机上的命令
    基础知识回顾 要回答标题中的疑问,我们首先要清楚,Pod是什么? Pod的翻译叫容器组,顾名思义,是一组容器 ...
  • 通过ExternalDNS集成外部DNS服务
    简介 ExternalDNS项目的目的是,将Kubernetes的Service/Ingress暴露的服务(的 ...
  • Kubefed学习笔记
    简介 联邦简介 集群联邦(Federation)的目的是实现单一集群统一管理多个Kubernetes集群的机 ...
  • 限制Pod磁盘空间用量
    Pod如何使用磁盘 容器在运行期间会产生临时文件、日志。如果没有任何配额机制,则某些容器可能很快将磁盘写满,影 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 63 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 4 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 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学习笔记 63 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 37 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • 基于Calico的CNI 27 people like this
  • Ceph学习笔记 25 people like this
  • Three.js学习笔记 22 people like this
Tag Cloud
ActiveMQ AngularJS Apache AspectJ CDT Ceph Chrome Command Cordova Coroutine CXF Cygwin Docker Eclipse ExtJS F7 FAQ GNU Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S LB libvirt Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT Photoshop PHP Porting Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • bytebuddy简单入门 – FIXBBS on Byte Buddy学习笔记
  • 4.深入Istio源码:Pilot的Discovery Server如何执行xDS异步分发-站长之家 on Istio Pilot与Envoy的交互机制解读
  • 4.深入Istio源码:Pilot的Discovery Server如何执行xDS异步分发? - luozhiyun`s Blog on Istio Pilot与Envoy的交互机制解读
  • Shan Shuog on Socket.io学习笔记
  • Alex on Socket.io学习笔记
  • Shan Shuog on Socket.io学习笔记
  • Alex on 内核缺陷触发的NodePort服务63秒延迟问题
  • 林哲緯 on 内核缺陷触发的NodePort服务63秒延迟问题
  • smileyihui on Bazel学习笔记
  • Android分享:代码混淆那些事 – FIXBBS on ProGuard学习笔记
  • core on Bazel学习笔记
  • atuter on Bazel学习笔记
  • Alex on Istio中的透明代理问题
  • Yann on Istio中的透明代理问题
  • haige on H.264学习笔记
  • dandelion on Bazel学习笔记
  • 别放不下 on Gradle学习笔记
  • yanick on 内核缺陷触发的NodePort服务63秒延迟问题
  • 许铭毅 on 基于Kurento搭建WebRTC服务器
  • 许铭毅 on 基于Kurento搭建WebRTC服务器
  • Alex on 基于C/C++的WebSocket库
  • chengjiaxi on 基于C/C++的WebSocket库
  • Alex on 2018年10月淮安区
©2005-2021 Gmem.cc | Powered by WordPress