Перемещение по xxx в разделе «.text» только для чтения – неправильный компилятор или настройка Linux в SUSE? ⇐ C++
-
Anonymous
Перемещение по xxx в разделе «.text» только для чтения – неправильный компилятор или настройка Linux в SUSE?
Я не часто пользуюсь Linux и думаю, что сделал что-то не так.
Это код для тестовой динамической библиотеки ".so", которую я создаю.
класс InternalClass { публика: int Function() {возврат 10; } }; внешний "С" { int WrapperFunctionSimple () {возвращение 10; } void WrapperCreateInstance() {InternalClass* item = новый InternalClass(); удалить пункт; } } Компиляция завершается с ошибкой:
g++ -Wall -fExceptions -O2 -c /home/lidia/compartida/TestLibrary/TestLibrary/main.cpp -o obj/Release/main.o g++ -shared obj/Release/main.o -o bin/Release/libTestLibrary.so -s /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: предупреждение: перемещение против ` _Znwm@@GLIBCXX_3.4» в разделе «.text», доступном только для чтения. /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: перемещение R_X86_64_PC32 по символу ` _Znwm@@GLIBCXX_3.4' нельзя использовать при создании общего объекта; перекомпилировать с -fPIC /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: окончательная ссылка не удалась: неверное значение Collect2: ошибка: ld вернул 1 статус выхода Я попробовал использовать -fPIC, как было предложено, и он скомпилировался. Но при использовании этой библиотеки ее невозможно загрузить, когда я добавляю последнюю функцию:
void WrapperCreateInstance() {InternalClass* item = new InternalClass(); удалить пункт; } Проблема в использовании InternalClass, без этой функции всё работает.
Я использую VirtualBox. Я установил OpenSUSE 64bit, приложение, использующее библиотеку, тоже 64bit. В другом дистрибутиве Linux (Mint) с точно таким же проектом и настройками (без fPIC) его можно скомпилировать. Когда я использую эту библиотеку (.so), она работает в SUSE.
Я также использую:
[*]gcc (SUSE Linux) 7.5.0 [*]g++ (SUSE Linux) 7.5.0 [*]Моя IDE — Code::Blocks 20 (последняя версия). Настройки пусты, за исключением флага -m64.
Что я делаю не так? Кажется, это могут помочь мне понять опытные пользователи Linux.
РЕДАКТИРОВАТЬ: Чтобы добавить дополнительную информацию, это можно скомпилировать в Ubuntu с теми же настройками. Нет в SUSE
Я не часто пользуюсь Linux и думаю, что сделал что-то не так.
Это код для тестовой динамической библиотеки ".so", которую я создаю.
класс InternalClass { публика: int Function() {возврат 10; } }; внешний "С" { int WrapperFunctionSimple () {возвращение 10; } void WrapperCreateInstance() {InternalClass* item = новый InternalClass(); удалить пункт; } } Компиляция завершается с ошибкой:
g++ -Wall -fExceptions -O2 -c /home/lidia/compartida/TestLibrary/TestLibrary/main.cpp -o obj/Release/main.o g++ -shared obj/Release/main.o -o bin/Release/libTestLibrary.so -s /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: предупреждение: перемещение против ` _Znwm@@GLIBCXX_3.4» в разделе «.text», доступном только для чтения. /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: obj/Release/main.o: перемещение R_X86_64_PC32 по символу ` _Znwm@@GLIBCXX_3.4' нельзя использовать при создании общего объекта; перекомпилировать с -fPIC /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: окончательная ссылка не удалась: неверное значение Collect2: ошибка: ld вернул 1 статус выхода Я попробовал использовать -fPIC, как было предложено, и он скомпилировался. Но при использовании этой библиотеки ее невозможно загрузить, когда я добавляю последнюю функцию:
void WrapperCreateInstance() {InternalClass* item = new InternalClass(); удалить пункт; } Проблема в использовании InternalClass, без этой функции всё работает.
Я использую VirtualBox. Я установил OpenSUSE 64bit, приложение, использующее библиотеку, тоже 64bit. В другом дистрибутиве Linux (Mint) с точно таким же проектом и настройками (без fPIC) его можно скомпилировать. Когда я использую эту библиотеку (.so), она работает в SUSE.
Я также использую:
[*]gcc (SUSE Linux) 7.5.0 [*]g++ (SUSE Linux) 7.5.0 [*]Моя IDE — Code::Blocks 20 (последняя версия). Настройки пусты, за исключением флага -m64.
Что я делаю не так? Кажется, это могут помочь мне понять опытные пользователи Linux.
РЕДАКТИРОВАТЬ: Чтобы добавить дополнительную информацию, это можно скомпилировать в Ubuntu с теми же настройками. Нет в SUSE
Мобильная версия