cmake - 从对象库中提取pdb文件

时间:2015-04-09 18:15:19

标签: visual-c++ cmake pdb-files

我正在使用object libraries构建我的静态库,如使用CMake 3.1.3所示。

我有

ADD_SUBDIRECTORY(A)
ADD_SUBDIRECTORY(B)
....
ADD_LIBRARY(mylib STATIC ${SOURCES}
                  $<TARGET_OBJECTS:A> 
                  $<TARGET_OBJECTS:B> )
SET_TARGET_PROPERTIES(mylib PROPERTIES COMPILE_PDB_NAME mylib COMPILE_PDB_OUTPUT_DIR ${CMAKE_BINARY_DIR})

现在,我的问题是A在A的CMake子目录中生成vc120.pdb。 B在B的CMake子目录中生成自己的vc120.pdb。并且,mylib在主二进制cmake文件夹中生成mylib.pdb。

我只想要一个静态库和一个pdb文件。我只想要mylib和mylib.pdb。

如何将所有vc120.pdbs合并到mylib.pdb中,或者理想情况下只生成一个pdb文件?

2 个答案:

答案 0 :(得分:3)

这不是您问题的直接答案,而是您可能需要考虑的替代解决方案。

使用静态库,最好使用/Z7来生成调试信息。使用/Z7时,编译器不会生成.PDB文件,而是将调试信息直接嵌入到生成的目标文件中。

当这些目标文件随后作为静态库链接时,lib.exe会将调试信息从所有目标文件复制到生成的.lib文件中。不需要使用.lib文件分发.pdb文件。

与CMake用于生成DLL或EXE的link.exe不同,lib.exe没有输出.PDB文件的选项。

通过CMake,您可以按以下方式设置所需选项。对于对象库使用:

add_library(A OBJECT lib2.cpp)
set_target_properties(A PROPERTIES COMPILE_OPTIONS "/Z7")

要生成最终的静态库,请使用:

add_library(mylib STATIC main.cpp $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B> )
set_target_properties(mylib PROPERTIES COMPILE_OPTIONS "/Z7")

答案 1 :(得分:1)

我设法联系了Kitware(CMake所有者)的人。

他们说过,

“将A,B和mylib的COMPILE_PDB_ *属性设置为指向同一个地方。对象库是独立构建的,不知道将使用它们(或者如果多个目标使用它们),所以它们需要单独配置。“

所以,在A&amp; B,做

add_library(A OBJECT a.c)
set_target_properties(A PROPERTIES
    COMPILE_PDB_NAME "mylib"
    COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)