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 A. B создает свой собственный vc120.pdb в подкаталоге CMake B. И mylib генерирует mylib.pdb в основной двоичной папке cmake.

Мне нужна только одна статическая библиотека и один файл pdb. Я просто хочу mylib и mylib.pdb.

Как я могу объединить все файлы vc120.pdb в mylib.pdb или, в идеале, просто создать только один файл pdb?


person Nick    schedule 09.04.2015    source источник


Ответы (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")
person sakra    schedule 15.04.2015

Мне удалось связаться с людьми из Kitware (владелец CMake).

Они сказали,

«Установите свойства COMPILE_PDB_* для A, B и mylib, чтобы все они указывали на одно и то же место. Библиотеки объектов создаются независимо и не знают, что их будет потреблять (или если их использует несколько целей), поэтому их необходимо настраивать индивидуально. ."

Итак, внутри A и B сделайте

add_library(A OBJECT a.c)
set_target_properties(A PROPERTIES
    COMPILE_PDB_NAME "mylib"
    COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)
person Nick    schedule 15.04.2015
comment
Использование этого подхода имеет последствия для параллельных сборок. См. zeuxcg.org/2010/11/22/. z7-все-старое-снова-ново - person sakra; 15.04.2015