Если вы не хотите распространять статические библиотеки с отладочной информацией, вам на самом деле не нужно объединять какие-либо файлы PDB (или использовать /Z7
для встраивания отладочной информации).
Как упоминалось @zhaorufei, при использовании /Zi
каждый объектный файл содержит ссылку на свой файл PDB, который затем использует компоновщик.
Просто используйте /Fd
, чтобы дать каждому объекту уникальный файл PDB:
> cl -c foo.cpp -Fo:target/foo.obj -Fd:target/foo.pdb -Zi
> cl -c bar.cpp -Fo:target/bar.obj -Fd:target/bar.pdb -Zi
> strings target/foo.obj | grep pdb
D:\Dev\sample\target\foo.pdb
> strings target/bar.obj | grep pdb
D:\Dev\sample\target\bar.pdb
Это также имеет то преимущество, что работает с проблемами одновременного доступа к общим PDB-файлам, упомянутым здесь , так что вы можете распараллелить шаг компиляции так, как вам хотелось.
Затем связывайте / архивируйте объектные файлы как обычно.
VC ++ уже встраивает различную информацию в объектные файлы для передачи их компоновщику, например, настройки ссылок во время выполнения и библиотеки зависимостей - путь к файлу PDB ничем не отличается. Создание статической библиотеки из объектов не удаляет ссылки:
> lib -out:target/all.lib target/foo.obj target/bar.obj
> strings target/all.lib | grep pdb
D:\Dev\sample\target\bar.pdb
D:\Dev\sample\target\foo.pdb
При связывании этой библиотеки с исполняемым файлом или DLL, компоновщик по-прежнему извлекает отладочную информацию из ссылочных PDB и добавляет ее в окончательный файл PDB.
Единственное предостережение, которое я вижу, это то, что путь всегда абсолютен, поэтому это может не сработать, если вы передвигаете файлы локально или на другую машину перед установкой связи.