Я хочу скомпилировать программу 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 в команду архив / библиотека?