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")