如何使用cmake编译静态库的发布版本时获取pdb文件?

时间:2015-11-23 07:01:55

标签: c++ visual-studio-2012 cmake static-libraries pdb-files

我有一个静态库,我正在使用cmake进行编译。现在,当我在调试模式下进行编译时,我会生成pdb文件,但是在编译发布模式时,不会生成pdb文件。以下是cmake中的一段代码:

    if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
        set_target_properties(${PROJECT_NAME} PROPERTIES IMPORTED_CONFIGURATIONS "Debug")
        set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_PDB_NAME ${PROJECT_NAME} COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin_debug" )
    elseif("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
        set_target_properties(${PROJECT_NAME} PROPERTIES IMPORTED_CONFIGURATIONS "Release")
        set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_PDB_NAME ${PROJECT_NAME} COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin_release" )

我想要pdb文件进行调试以及发布版本。那么,我怎么能拥有它?建议是真的需要。

2 个答案:

答案 0 :(得分:2)

CMake会像Visual Studio一样为您的VS解决方案生成Release配置。

但您可以将调试信息添加到其他配置中,例如/Zi - 也可以使用例如/Z7target_compile_options()generator experssions提供必要的target_compile_options( ${PROJECT_NAME} PRIVATE "$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:RELEASE>>:/Zi>" ) project(...) if (MSVC) add_compile_options("/Zi") endif() 命令:

[ {
    "id" : 1,
    "name" : "latha"
}, {
    "id" : 2,
    "name" : "kala"
}]

或者你可以说你希望它适用于所有配置和add_compile_options()的所有目标(并且没有生成器表达式以提高可读性):

public class NSCLockData {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }   
}

<强>参考

答案 1 :(得分:0)

我没有使用过CMake,但看起来它会生成Visual Studio项目和解决方案文件,所以基于...

默认情况下,VS不会在发布配置中生成.pdb。为此,您需要在项目文件中使用一些属性。因此,您需要让CMake在它生成的.xxproj文件中输出类似于下面的内容:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <DefineDebug>false</DefineDebug>
    <Optimize>true</Optimize>
</PropertyGroup>

这些属性为您提供了另外一个发布/优化版本,唯一的区别是它也会生成.pdb。

PropertyGroup可能会因您的配置而异,但您需要有效(正在编译)的配置才能拥有子属性。