Как сделать статическое связывание со стандартной библиотекой C ++? - PullRequest
1 голос
/ 01 апреля 2019

У меня есть объектный файл (a.obj), и мне нужно получить исполняемый файл (a.exe) через вызов компоновщика из командной строки.Я получил файл .obj из этой программы:

#include "stdio.h"
int main(){
    puts("Hello world");
}

, и я использовал компилятор clang для генерации файла .obj с дополнительными аргументами: "clang.exe -c a.cpp".

Моя проблема заключается в использовании метода "put", который определен в стандартной библиотеке (может быть libvcruntime.lib), и я не знаю, какие аргументы использовать для связи со стандартной библиотекой.

Мой компоновщик - это Microsoft link.exe, и я также могу получить компоновщик lld из проекта llvm (он более предпочтителен).

Моя глобальная цель - получить исполняемый файл из llvm ir и вызвать компоновщик lldиз кода, но есть другая история:)

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Если вы создаете для Windows с Clang и хотите использовать стандартные библиотеки Visual C ++, я предлагаю вам использовать clang-cl, драйвер, который преобразует параметры командной строки cl Visual C ++ в собственные параметры clang.

Вы сказали, что пишете:

clang -c a.cpp

Опция -c просит компилятор просто создать и объектный файл и остановить (вместо отправки объектного файла компоновщику). Звучит так, как будто вы хотите, чтобы clang вызвал компоновщик, поэтому вы должны опустить -c.

Чтобы использовать статическую версию стандартной библиотеки, укажите /MT (или /MTd, если вы хотите отладочную версию стандартной библиотеки).

Собрав все это вместе, это должно работать для вас:

clang-cl /MT a.cpp

clang-cl переведет /MT в эквивалентные опции для clang, а затем запустит clang. Когда clang завершает компиляцию объектного файла, он автоматически вызывает lld (компоновщик LLVM) с параметрами, совместимыми с параметрами, используемыми для компиляции, что должно привести к созданию рабочего исполняемого файла.

Некоторое время, при использовании clang для компиляции для Windows, вам нужно было использовать Microsoft LINK вместо lld. Но последние версии могут использовать lld и, по сути, будут использовать lld по умолчанию.

0 голосов
/ 01 апреля 2019

Visual Studio

Укажите /MT(d) вместо /MD(d) в конфигурации проекта. документы

лязг

-static-libstdc ++ -static-libgcc. * документы 1016 *

...