2015-11-23 35 views
0

我有一個靜態庫,我正在使用cmake編譯。現在,當我在調試模式下聯編時,我得到了生成的pdb文件,但是當編譯發佈模式時,不會生成pdb文件。以下是cmake中的代碼片段:如何使用cmake編譯靜態庫的發佈版本時獲取pdb文件?

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文件。那麼,我怎麼能擁有它?建議是非常必要的。

回答

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可以根據您的配置而有所不同,但您需要活動(正在編譯)的配置才能具有子屬性。

+0

內部.xxproj我可以看到:<條件的PropertyGroup = 「 '$(配置)| $(平臺)' == '推出| 64'」> C:\ repo \ Release \ minizip.pdb但是隻有Release文件夾被創建並且全部爲空:( – Learner

+0

)仔細閱讀CMake文檔,看起來好像有一個「目標變量」叫做: VS_GLOBAL_ ,其中您將替換爲該變量的名稱,因爲它應該在項目文件中。 https://cmake.org/cmake/help/v2.8.8/cmake.html#prop_tgt:VS_GLOBAL_variable你可以嘗試以這種方式定義DebugType = pdbonly。 –

2

CMake會像Visual Studio一樣爲您的VS解決方案生成RelWithDebInfo配置。

但是,您可以將調試信息添加到其他配置 - 例如Release - 也可以使用例如, target_compile_options()generator experssions給予必要的/Zi/Z7命令:

project(...) 
if (MSVC) 
    add_compile_options("/Zi") 
endif() 

target_compile_options(
    ${PROJECT_NAME} 
    PRIVATE 
     "$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:RELEASE>>:/Zi>" 
) 

,或者你可以只說你想要的所有配置,並與add_compile_options()(且不產生表達式更好的可讀性)所有目標

參考

+0

謝謝你這麼多。你的建議真的有效,現在我有調試和發佈的PDB文件。:) – Learner

+0

@Learner歡迎您。增加了另一個'add_compile_options()'變體。 – Florian