Перемещение по xxx в разделе «.text» только для чтения – неправильный компилятор или настройка Linux в SUSE?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Перемещение по xxx в разделе «.text» только для чтения – неправильный компилятор или настройка Linux в SUSE?

Сообщение Anonymous »


Я не часто пользуюсь 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»