Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用调试模式在LLVM中编译一些模块,使用发布模式编译其他模块?_Llvm - Fatal编程技术网

如何使用调试模式在LLVM中编译一些模块,使用发布模式编译其他模块?

如何使用调试模式在LLVM中编译一些模块,使用发布模式编译其他模块?,llvm,Llvm,完全调试编译需要太多内存。我的机器只有4GB内存。我想使用调试编译器调试一个模块,其他模块使用版本编译 通常,我使用以下命令在调试模式或发布模式下构建LLVM: cmake /home/llvm380 -DCMAKE_BUILD_TYPE="Release" cmake /home/llvm380 -DCMAKE_BUILD_TYPE="Debug" 构建类型的选择会影响整个构建过程。完全调试构建不便于调试,因为它需要大约13GB的内存。我只想调试代码的一小部分 示例:我想进行llvm/

完全调试编译需要太多内存。我的机器只有4GB内存。我想使用调试编译器调试一个模块,其他模块使用版本编译

通常,我使用以下命令在调试模式或发布模式下构建LLVM:

cmake /home/llvm380 -DCMAKE_BUILD_TYPE="Release" 

cmake /home/llvm380 -DCMAKE_BUILD_TYPE="Debug" 
构建类型的选择会影响整个构建过程。完全调试构建不便于调试,因为它需要大约13GB的内存。我只想调试代码的一小部分


示例:我想进行
llvm/lib/IR
模块调试构建。如何修改
llvm\lib\IR
中的
CMakeLists.txt

llvm与CMake一起工作,因此要在特定模块上启用调试模式,您需要在特定文件上启用
-g
标志,或者在整个构建目标上启用它。您很可能需要:

编译标志
编译定义
目标属性(请参阅)或
编译标志
源文件属性

我已经在一个项目上很快地尝试了这个方法,包括文件级和目标级,并且可以确认它是可行的

假设您有一个文件
MySourceFile.cpp
和一个构建目标
MyTarget
。下面我添加了
-hack-target
-hack-file
,以便更好地查看这会导致什么结果

set(my_source_files
  MySourceFile.cpp
)

add_library(MyTarget SHARED ${my_source_files} ...)
在目标级别添加-g标志:

get_target_property(my_target_compile_flags MyTarget COMPILE_FLAGS)
if (NOT my_target_compile_flags)
  set(my_target_compile_flags "")
endif()
set_target_properties(MyTarget
                      PROPERTIES COMPILE_OPTIONS  
                      "${my_target_compile_options} -g -hack-target")
在源文件级别添加-g标志:

get_source_file_property(my_source_file_compile_flags
                         MySource.cpp
                         COMPILE_FLAGS)

if (NOT my_source_file_compile_flags)
  set(my_source_file_compile_flags "")
endif()
set_source_files_properties(MySource.cpp
                            PROPERTIES
                            COMPILE_FLAGS
                            "${my_source_file_compile_flags} -g -hack-file")
通过以上几行,可以方便地在需要的东西上启用
-g
标志,从而创建CMake助手函数


我可以说这是如何在忍者和Xcode上工作的:

忍者

$ grep -ri "hack-" BuildNinja

BuildNinja//build.ninja:  FLAGS = -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -fPIC    -g -hack-target -std=c++11  -g -hack-file
Xcode

在Xcode
-g
中,目标级别转到“生成调试符号”属性:

这是旗帜的样子:

目标一:


文件一:

如果没有太多的黑客攻击,这可能是不可能的。如果没有对LLVM的CmakeList文件进行黑客攻击,这可能是不可能的。但如果你准备好攻击他们,这绝对是可能的。我不明白为什么这个问题被搁置。选民们似乎完全脱离了背景,因为这个问题是绝对清楚和有效的。@freyone,你的问题对我来说非常清楚,但我可以看出,这会让投票支持这个问题的人感到困惑,认为这个问题“太广泛”。请填写更多的细节,比如您正在从源代码构建LLVM,并希望根据您的建议调试其特定模块等。我在我的模块中修改了Cmakelists.txt。那以后,怎么做呢?仍然是“cmake/home/llvm380-DCMAKE_BUILD_TYPE=“Release”需要添加“-g”?不,您只需在CMakeLists中添加
-g
,如我所示。不需要将其传递到任何其他地方。是的,您必须再次运行
cmake…
命令。可以随意使用CMake的
消息
命令调试CmakeList文件。示例:
消息(状态“这是运行cmake时将看到的调试字符串”)
。另请参见。您是想获得COMPILE\u选项的\u target\u属性而不是COMPILE\u标志吗?我想我在回答时发布了工作代码。你可能知道它们是一样的:,对。