В Windows MSVC можно ли объединить некоторые .obj в один .obj? Если да, то как мне это сделать?

Например, есть три объектных файла a.obj b.obj c.obj просто скомпилирован с cl, и желательно объединить их в один combined.obj.

Комментарий к вопросу SO указывает, что на *nix можно делать такие вещи с ld. Однако,cl а также link все кажется только поддержка .exe, .dll а также .lib как выход.


Вся процедура того, что я хочу сделать с объединенным объектным файлом, выглядит следующим образом:

  1. a.obj b.obj c.obj -> combined.obj
  2. combined.obj d.obj e.obj -> executable.exe

Моя проблема решена. a.obj b.obj c.obj использовать некоторые переменные и функции, которые еще предстоит связать, и я подумал, что .libне может терпеть отсутствующие функции, так как это библиотека, но на самом деле это нормально. Я могу просто объединить их в.lib файл:

lib *.obj /OUT:combined.lib

2 ответа

Решение

Вроде нет, но их удобно объединить в .lib:

      lib *.obj /OUT:combined.lib

Вы можете применить метод, использованный здесь, также к файлам COFF, созданным cl.exe, при условии, что ваша сборка поддерживает соответствующие форматы ввода и вывода, и эти форматы подходят для процесса.

Что вы можете сделать в таком случае, это (и да $INPUTSозначает, что вы можете указать несколько объектных файлов по своему усмотрению):

      ld --oformat pe-x86-64 -r $INPUTS -o $OUTPUT

В --oformat pe-x86-64(он же AMD64, x64 в Windows) необходим всякий раз, когда был создан с другим форматом вывода по умолчанию.

Если это так, и вы не дали --oformatвы получите что-то вроде:

      ld: relocatable linking with relocations from format pe-x86-64 (input.obj) to format elf64-x86-64 (output.obj) is not supported

Однако этот процесс не работает для всех комбинаций форматов ввода/вывода, как я узнал с помощью ld2.34 в Ubuntu 20.04:

      ld: relocatable linking with relocations from format pe-i386 (input.obj) to format pe-i386 (output.obj) is not supported

NB: на данный момент мне не повезло заставить это работать с lld-linkили же ld.lld(оба доступны в современных версиях VS).

Другие вопросы по тегам