gcc / ld объединяет библиотеки, которые используют разные версии одной и той же связанной библиотеки - PullRequest
0 голосов
/ 31 мая 2018

Я хочу скомпилировать программу main, которая использует два разных модуля m1 и m2, каждый из которых использует разные версии библиотек ./f1/libfa и `./f2/libf.a.Я не могу изменить источник в библиотеках libf, у меня есть доступ только к источникам main, m1 и m2.

gfortran -o main main.F90 -L./f1 -lf m1.o -L./f2 -lf m2.o && ./main

По умолчанию для компоновщика ./f1/libf используется и m1 и m2.Как я могу заставить m1 использовать библиотеку из ./f1 и m2 использовать библиотеку из ./f2

Идеи (все из которых до сих пор потерпели неудачу)

  • Путь к библиотеке ссылок манипулирования (но я могу добавить только путь, но не удалить из пути с помощью -L
  • использовать --exclude-libs, скрыть символы ...
  • Переименовать символы во время этапа связывания

Доступен минимальный пример https://github.com/platipodium/multisymbol. Любая помощь с благодарностью.

Я пытался objcopy

objcopy --redefine-sym __f_MOD_g=_f1_f_MOD_g f1/libf.a objcopy --redefine-sym __f_MOD_g=_f1_f_MOD_g f1/f.o objcopy --redefine-sym __f_MOD_g=_f1_f_MOD_g m1.o

Сейчассимволы кажутся правильными и разными, но я получаю

gfortran -o main main.F90 -Lf1 -lf m1.o -Lf2 -lf m2.o && ./main m2.o: In function __ m2_MOD_b ': m2.F90 :(. text + 0x5): неопределенная ссылка на __f_MOD_g'

напрямую с использованием объектных файловтеперь работает.

gfortran -o main main.F90 f1/f.o m1.o f2/f.o m2.o && ./main I am first I am second

Итак, что нужно сделать, чтобы превратить из вышеуказанной рабочей команды с файлами obj в команду архив / библиотека?

1 Ответ

0 голосов
/ 31 мая 2018

Значения по умолчанию для компоновщика приводят к тому, что ./f1/libf используется обоими m1 и m2.

Ожидается: это просто , как работают линкеры UNIX .

Как заставить m1 использовать библиотеку из ./f1 и m2 использовать библиотеку из ./f2

Вам придется переименовывать любые конфликтующие символы (objcopyможет сделать это).

Обновление:

Я попробовал objcopy ...
gfortran -o main main.F90 -Lf1 -lf m1.o -Lf2 -lf m2.o

Этокомандная строка неверна, по причинам, описанным в разделе «как работают линкеры UNIX» выше.

Вы хотите:

gfortran -o main main.F90 m1.o m2.o -Lf1 -lf -Lf2 -lf

На самом деле, это тоже вряд ли будет работать: вы также хотите переименоватьf2/libf.a -> f2/libf2.a, а затем:

gfortran -o main main.F90 m1.o m2.o -Lf1 -lf -Lf2 -lf2
...