Обычно distutils
/ setuptools
не используют компоновщик напрямую, а вызывают внешний интерфейс, например gcc
для c -расширения или g++
для c ++ - расширений.
Эти интерфейсы собрать всю необходимую информацию - например, какие библиотеки следует передать компоновщику, например, libstdc++
для расширений c ++ - и вызвать компоновщик с правильными параметрами командной строки. Это можно увидеть при передаче опции -v
в gcc
- g++
-фронтенда, например, через extra_link_args
в setup.py
.
Так что если вы нажмете distutuls
/ setuptools.py
чтобы использовать ld
напрямую, вы также должны предоставить все опции, собранные веб-интерфейсом в extra_link_args
, в противном случае некоторые библиотеки будут отсутствовать, и компиляция, как вы видите, завершится неудачей.
Это довольно сложно разрешить setup.py
, чтобы выбрать другой компоновщик, но есть несколько дешевых вариантов сделать это локально:
- Компоновщик по умолчанию (например,
/usr/bin/ld
) - это просто символическая ссылка, пусть он указывает на компоновщик Ваш выбор. - Передача
-B
-опция через extra_link_args
, т.е. -B/path/to/folder/with/my/linker
. Тонкие детали: 1) компоновщик должен называться ld
(при необходимости создайте символическую ссылку) 2) некоторые дистрибутивы (например, Anaconda) уже предоставляют опцию -B
, которая имеет приоритет над путем, пройденным через extra_link_args
, В этом случае одним из возможных решений было бы модифицировать выдаваемую командную строку, как описано в этом SO-post . - , установить компоновщик напрямую через переменную окружения
LDSHARED
и предоставить все необходимые параметры в extra_link_args
.
Вариант 2, вероятно, проще всего настроить для работы в любой системе:
- определить, есть ли
ld.lld
, если да: - создать временную папку с символической ссылкой на нее (называемую
ld
) - добавить эту временную папку как
-B
-опции в extra_link_args
- определить, использует ли уже дистрибутив Опция
-B
, манипулирование командной строкой (как описано здесь , например), чтобы обеспечить приоритет временной папки.