Cmake - извлечение файлов pdb из библиотек объектов
Я создаю свою статическую библиотеку, используя библиотеки объектов, как показано с помощью 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 генерирует vc120.pdb в подкаталоге CMake.
B генерирует собственный vc120.pdb в подкаталоге B CMake. И mylib генерирует mylib.pdb в основной двоичной папке cmake.
Мне нужна только одна статическая библиотека и один файл pdb. Я просто хочу mylib и mylib.pdb.
Как я могу объединить все vc120.pdbs в mylib.pdb или идеально просто сгенерировать только один файл pdb?
Ответы
Ответ 1
Мне удалось связаться с людьми в Kitware (владелец CMake).
Они сказали:
"Установите свойства COMPILE_PDB_ * A, B и mylib, чтобы указать на одно и то же место. Библиотеки объектов создаются независимо и не знают, что их потребляет (или если их потребляют несколько целей), поэтому они должны настраиваться индивидуально".
Итак, внутри A и B, do
add_library(A OBJECT a.c)
set_target_properties(A PROPERTIES
COMPILE_PDB_NAME "mylib"
COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)
Ответ 2
Это не прямой ответ на ваш вопрос, а альтернативное решение, которое вы можете рассмотреть.
В статических библиотеках вам, вероятно, лучше использовать /Z7
для генерации отладочной информации. При использовании /Z7
компилятор не создает файл .PDB, но вставляет информацию об отладке непосредственно в сгенерированные объектные файлы.
Когда эти объектные файлы затем связаны как статическая библиотека, lib.exe
копирует информацию об отладке из всех объектных файлов в полученный .lib файл. Нет необходимости распространять файл .pdb с файлом .lib.
В отличие от link.exe
, который используется CMake для создания DLL или 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")