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

Visual c++ cmake-从对象库中提取pdb文件,visual-c++,cmake,pdb-files,Visual C++,Cmake,Pdb Files,我正在使用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_P

我正在使用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})
ADD_子目录(A)
添加_子目录(B)
....
添加库(mylib STATIC${SOURCES}
$ 
$ )
设置\u目标\u属性(mylib属性编译\u PDB\u名称mylib编译\u PDB\u输出\u目录${CMAKE\u二进制\u目录})
现在,我的问题是A在A的CMake子目录中生成vc120.pdb。 B在B的CMake子目录中生成自己的vc120.pdb。并且,mylib在主二进制cmake文件夹中生成mylib.pdb

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


<>我如何将所有的VC120 .PDBS合并成MyLIB PDB或理想地只生成一个PDB文件?

< P>这不是你的问题的直接答案,而是你可能要考虑的另一个解决方案。 对于静态库,您最好使用
/Z7
生成调试信息。使用
/Z7
时,编译器不会生成.PDB文件,而是将调试信息直接嵌入到生成的目标文件中

当这些对象文件作为静态库链接时,
lib.exe
将调试信息从所有对象文件复制到生成的.lib文件中。不需要将.pdb文件与.lib文件一起分发

与CMake使用的
link.exe
生成DLL或and 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")
add_库(mylib STATIC main.cpp$$)
设置目标属性(mylib属性编译选项“/Z7”)

我设法联系了Kitware(CMake所有者)的员工

他们说,

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

那么,在A&B内部,你要做什么

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

使用这种方法会对并行构建产生影响。看见