【发布时间】:2016-09-15 11:11:36
【问题描述】:
我正在尝试使用 cmake 和 lldb 从命令行编译和调试。我不确定为什么这不起作用:
cmake_minimum_required (VERSION 2.6)
project (etest)
include_directories(src)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -g")
add_executable(etest src/m.cpp)
set_property(TARGET etest PROPERTY CXX_STANDARD 14)
set_property(TARGET etest PROPERTY CXX_STANDARD_REQUIRED ON)
然后:
~/Desktop/em2 cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/jbake/Desktop/em2
~/Desktop/em2 make
[ 50%] Building CXX object CMakeFiles/etest.dir/src/m.cpp.o
[100%] Linking CXX executable etest
[100%] Built target etest
~/Desktop/em2 lldb etest
(lldb) target create "etest"
Current executable set to 'etest' (x86_64).
(lldb) b src/m.cpp:7
Breakpoint 1: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb) breakpoint list
Current breakpoints:
1: file = 'src/m.cpp', line = 7, locations = 0 (pending)
我认为-g 选项对于将调试位置添加到可执行文件以与 lldb 一起使用是必要的,但我已经尝试了数小时的各种调整,但无法解决任何问题。我错过了什么?
【问题讨论】:
-
编译可执行文件时显示
make VERBOSE=1的编译选项是什么?CMAKE_CXX_FLAGS添加新标志,但不删除特定于配置的选项。 -
@Tsyvarev 我发现我需要引用 cmake 文件中的路径,但只有当我从 lldb 断点中删除
src/时,它才会找到它。这对我来说似乎很奇怪。我想如果我有两个同名的源,那么它要么需要目录,要么会在两个文件中设置相同的断点。我得试验一下。但除此之外,路径不是文件名的一部分,应该省略 -
无论如何,了解编译行会有很大帮助。 CMake 有可能将源文件复制到构建树下的某个目录中,然后在那里构建它。这样它会丢失路径前缀。另一种可能性,它使用源文件的绝对路径来编译它。