В настоящее время я портирую некоторое программное обеспечение со старого Power Hawk на систему iHawk Concurrent.Мой компилятор фортранов - Concurrent cf77.Нет, у меня нет возможности переключиться на gfortran, мне нужны некоторые флаги компилятора этого компилятора.
В нескольких файлах * .f мне нужна длина непрерывных символов, давайте назовем их «строками».В прошлом у нас была внутренняя библиотека компании, предоставляющая мне функцию lstr = lg(str)
Эта функция больше не доступна.Итак, переменные, которые я пытаюсь получить, объявляются следующим образом:
integer function number(str, state)
implicit none
character str*(*)
integer*1 z/ '30'x /
integer*2 j,i
j = lg(str)
do i=1 , j
num = ichar( str(i:i) ) - z
if(num.lt.0) then
state = 1
return
end if
end do
state= 0
return
end
Итак, я попробовал этот метод len () вместо lg (), но это дает мне ошибку компиляции:
file.f: XXX undefined reference to `len_'
Так что я подумал, что я не такой глупый, возможно, это проблема не добавлять подчеркивание, поэтому для Concurrent достаточно объявить его как CEXTERNAL:
CEXTERNAL len
Ха-ха, нетсупер не умный разработчик теперь имеет следующую ошибку:
file.f: XXX undefined reference to `len'
В настоящее время я компилирую / связываю со следующими флагами:
cf77 -g --cpu=pentium -c -Nt5000 -lpthread $@
cf77 -g --cpu=pentium -o -Wl,-rpath-link=/usr/lib,-lc,/usr/lib/librt.a $@
Комментарий: --cpu=pentium
is crossкомпиляция для 32-битной целевой машины на 64-битной машине с 64-битным компилятором.с -Wl,-rpath-link= (...)
я передаю флаги компоновщику.Если я пропущу это, используя только: -L/usr/lib -lc
, я получу следующее:
/usr/lib/librt.so: undefined reference to `__pthread_unwind@GLIBC_PRIVATE'
/usr/lib/librt.so: undefined reference to ¸pthread_sigmask@GLIBC2.0'
и т. Д.их куча.Добавление librt.a приводит к тому же.Работает только с ключом -Wl, -rpath-link = arg, arg, arg.
Возможно, мне просто не хватает нужной библиотеки?Этот метод len()
действительно делает то, для чего он мне нужен, или у вас есть предложения?