2016-06-07 3 views
1

Я пытаюсь запустить исполняемый файл - SaTScanBatch, исполняемый файл программного обеспечения SaTScan - на удаленном компьютере с терминала.libstdC++. So.6: версия не найдена - НЕТ прав администратора

Здесь ошибка я получаю

/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.15' not found

Проблема похожа на них: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found или How to fix: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found или /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

Чем отличается в моем случае является то, что у меня нет прав администратора , поэтому я не могу добавлять библиотеки в файл usr/lib. Я загрузил libstdC++. 6.0.15 в мой удаленный репозиторий, и я хочу использовать его для выполнения моего файла.

Вот возможности я пытался

I) Изменение переменной среды LD_LIBRARY_PATH или LD_RUN_PATH или LD_PRELOAD на путь libstdC++. So.6.0.15. -> ничего не изменило

II) Включить библиотеку в статически

gcc SaTScanBatch -static-libstdc++ 

-> -static опция не распознается, я думаю GCC версии удаленной машины слишком старый.

III) Попробуйте связать файл с дополнительной библиотеки:

gcc SaTScanBatch -L /path/library -l stdc++ 

или аналогичным

gcc SaTScanBatch -Wl,-rpath,path/to/library 

-> Error

/usr/bin/ld: warning: Cannot create .eh_frame_hdr section, --eh-frame-hdr ignored. 
/usr/bin/ld: error in SaTScanBatch64(.eh_frame); no .eh_frame_hdr table will be created. 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../lib64/crt1.o: In function _start: 
(.text+0x20): undefined reference to "main" 
collect2: ld returned 1 exit status 

IV) Использование PatchElf для связать файл и библиотека -> Я не могу установить PatchElf, потому что никаких прав администратора

Благодарим за предложение!

ответ

0

Изменить переменную среды LD_LIBRARY_PATH или LD_RUN_PATH или LD_PRELOAD на путь libstdC++. So.6.0.15. -> ничего не менял

Что именно вы пробовали?

LD_LIBRARY_PATH должен быть установлен в каталог, содержащем новый libstdc++.so.6 а не сам файл, и вы должны export переменных окружения так он доступен для дочерних процессов, а не только для вашей оболочки. И вам нужна символьная ссылка с libstdc++.so.6 в libstdc++.so.6.0.15, потому что динамический загрузчик будет искать это имя, а не libstdc++.so.6.0.15

LD_RUN_PATH используется во время связывания испечь путь в исполняемый файл. Он ничего не делает во время выполнения при попытке запустить исполняемый файл. Если вы используете его, вам необходимо установить его в каталог, который будет содержать файл libstdc++.so.6на удаленной машине. Опять же, он должен быть установлен в каталог, а не путь к файлу.

LD_PRELOAD что-то другое, и почти наверняка не то, что вы хотите. Вы должны использовать его для принудительной загрузки определенной общей библиотеки перед тем, как запускается исполняемый файл. Это можно использовать для предварительной загрузки нового libstdC++, но обычно лучше использовать LD_LIBRARY_PATH для установки пути во время выполнения или LD_RUN_PATH, чтобы установить путь во время ссылки.

Попытка связать файл с дополнительной библиотеки:

Команды, которые вы показали, это нонсенс, они не включают в себя какие-либо предметы в ссылке, так что вы пытаетесь создать исполняемый файл из из ничего. Вот почему вы получаете ошибку undefined reference to "main"

Для вашего сценария я бы рекомендовал использовать LD_LIBRARY_PATH.

Смежные вопросы