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

cmake - extracting pdb files from object libraries

我正在使用 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.pdb 合并到 mylib.pdb 或理想情况下只生成一个 pdb 文件?

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

对于静态库,您最好使用 /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")

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

他们说,

"Set the COMPILE_PDB_* properties of A, B, and mylib all to point to the same place. Object libraries are built independently and do not know what will consume them (or if multiple targets consume them), so they need to be configured individually."

因此,在 A 和 B 中,执行

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