Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
Visual studio 如何使用cmake标志为发布版本生成pdb文件?_Visual Studio_Visual Studio 2012_Cmake_Pdb Files - Fatal编程技术网

Visual studio 如何使用cmake标志为发布版本生成pdb文件?

Visual studio 如何使用cmake标志为发布版本生成pdb文件?,visual-studio,visual-studio-2012,cmake,pdb-files,Visual Studio,Visual Studio 2012,Cmake,Pdb Files,我正在使用cmake生成visual studio解决方案。现在我想为发布版本生成pdb文件。(为什么?因为我想要这些符号,以防用户发现一些bug) 我尝试设置以下标志,但未成功: set(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "Build Types" FORCE) IF(WIN32) set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR

我正在使用cmake生成visual studio解决方案。现在我想为发布版本生成pdb文件。(为什么?因为我想要这些符号,以防用户发现一些bug)

我尝试设置以下标志,但未成功:

set(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "Build Types" FORCE)

IF(WIN32)

set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release")
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "/debug /INCREMENTAL")
set( CMAKE_SHARED_LINKER_FLAGS_RELEASE "/debug /INCREMENTAL")
set( CMAKE_MODULE_LINKER_FLAGS_RELEASE "/debug /INCREMENTAL")
set( CMAKE_CXX_FLAGS_RELEASE "/MD /Zi /O2 /Ob1 /D NDEBUG")
set( CMAKE_C_FLAGS_RELEASE "/MD /Zi /O2 /Ob1 /D NDEBUG")
ENDIF(WIN32)
看起来Cmake正在忽略以下集合: 提前感谢您的帮助

我用了旗子

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")

解释“Modern Cmake”中的详细信息。您可以为每个目标设置此选项,方法如下:

if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC" AND CMAKE_BUILD_TYPE MATCHES "Release")
   target_compile_options(${TARGET_NAME} PRIVATE /Zi)

   # Tell linker to include symbol data
    set_target_properties(${TARGET_NAME} PROPERTIES 
        LINK_FLAGS "/INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF"
    )

    # Set file name & location
    set_target_properties(${TARGET_NAME} PROPERTIES 
        COMPILE_PDB_NAME ${TARGET_NAME} 
        COMPILE_PDB_OUTPUT_DIR ${CMAKE_BINARY_DIR}
    )
endif()

这些标志是特定于MSVC的,而不是WIN32的。另一种方法是使用
cmake
生成器表达式(),例如:

对于所有目标和所有配置:

add_compile_options("$<$<NOT:$<CONFIG:Debug>>:/Zi>")
add_link_options("$<$<NOT:$<CONFIG:Debug>>:/DEBUG>")
add_link_options("$<$<NOT:$<CONFIG:Debug>>:/OPT:REF>")
add_link_options("$<$<NOT:$<CONFIG:Debug>>:/OPT:ICF>")

你能详细说明一下吗?没有成功?您是否收到错误、缺少结果或根本不起作用?根本不起作用。我想知道行“set(CMAKE_CONFIGURATION_TYPES${CMAKE_BUILD_TYPE}缓存字符串“BUILD TYPES”FORCE)”是否覆盖了标记。除了
add_executable(out a.cpp b.cpp)
之外,我还尝试了这一操作。当我构建发布配置时,还有一个.pdb文件。它是可调试的。你能发布更多细节吗?顺便说一句,在为MSVC生成时不要使用
CMAKE\u BUILD\u TYPE
CMAKE\u SHARED\u LINKER\u FLAGS\u RELEASE
是一个全局缓存变量,因此我必须添加
CACHE STRING”“FORCE
。另外,请确保根据需要使用
CMAKE\u STATIC\u LINKER\u FLAGS\u RELEASE
CMAKE\u EXE\u LINKER\u FLAGS\u RELEASE
vars。变量
CMAKE\u CXX\u FLAGS\u RELEASE
没有可用的CMAKE文档。你在哪里找到的?哇,我不知道。谢谢@DrumM,没有太多文档,但是这里有和链接文章解释了移动到这里的细节:好吧,在现代CMake中,您应该使用生成器表达式,因为在配置步骤中,MSVC未定义
CMake_BUILD_TYPE
的值。请参阅中的已接受答案,但正如答案所述,使用“-DCMAKE\u BUILD\u TYPE=Debug”,它是在配置时定义的,对吗?然后您可以使用“if(CMAKE\u BUILD\u TYPE STREQUAL Release)”。我们一直都做得很好,问题是您可以在配置时传递
-DCMAKE\u BUILD\u TYPE=Debug
,然后在Visual Studio中将项目构建为发行版(生成时)。因此,对于多个配置IDE(包括VS),在配置时依赖
CMAKE\u BUILD\u TYPE
是不可靠的。例如,在您的代码案例中,您可以做相反的事情,将
CMAKE_BUILD_TYPE
作为
Release
传递,然后通过IDE作为
Debug
构建项目,您很可能会得到重复的
“/INCREMENTAL:NO/Debug/OPT:REF/OPT:ICF”
标志。我同意,在这种情况下,这可能没有什么害处,但可能会破坏其他人的内部版本。在重新阅读我的评论后,我认为我可能没有表达我的观点,即:您根本不应该通过Visual Studio的
CMAKE_build_TYPE
,因为它没有使用它。引用文档:“此变量仅对单个配置生成器有意义”。无论何时在代码中使用它,都应将其与任何其他用户定义变量(例如
MY\u BUILD\u TYPE
variable)区别对待。没有生成器表达式,您的方法只是“现代CMake”的一半。这是真的!但是谁说我想使用Visual Studio:-)我唯一感到奇怪的是,您必须对其他调用执行相同的生成器表达式:
set\u target\u properties
set\u target\u properties
。比如1
如果
还不够,那么添加链接选项和添加编译选项对我有效,而扩展CMAKE变量(比如2015年的回复)对我无效。
target_compile_options(my_exe PRIVATE "$<$<CONFIG:Release>:/Zi>")
target_link_options(my_exe PRIVATE "$<$<CONFIG:Release>:/DEBUG>")
target_link_options(my_exe PRIVATE "$<$<CONFIG:Release>:/OPT:REF>")
target_link_options(my_exe PRIVATE "$<$<CONFIG:Release>:/OPT:ICF>")