В Windows MSVC можно ли объединить некоторые .obj в один .obj? Если да, то как мне это сделать?
Например, есть три объектных файла a.obj b.obj c.obj
просто скомпилирован с cl
, и желательно объединить их в один combined.obj
.
Комментарий к вопросу SO указывает, что на *nix можно делать такие вещи с ld
. Однако,cl
а также link
все кажется только поддержка .exe
, .dll
а также .lib
как выход.
Вся процедура того, что я хочу сделать с объединенным объектным файлом, выглядит следующим образом:
a.obj b.obj c.obj
->
combined.obj
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
Однако этот процесс не работает для всех комбинаций форматов ввода/вывода, как я узнал с помощью
ld
2.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).