我正在使用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文件?
答案 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}"
)