Почему оба кода добавляют -visibility=hidden, обычные функции компилируются неправильно, а виртуальные функции компилируC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Почему оба кода добавляют -visibility=hidden, обычные функции компилируются неправильно, а виртуальные функции компилиру

Сообщение Гость »


Я читаю эту страницу.

Я следую ответу шаг за шагом, чтобы проверить, а также добавить

Код: Выделить всё

-fvisibility=hidden
, чтобы скрыть все символы, а затем я расширил код, содержащийся в ответе.

Код: Выделить всё

//rectangle.h
#pragma once

#include 

class Rectangle {
int width, height;
public:
void set_values (int,int);
int area();

};

std::shared_ptr __attribute__((visibility("default"))) get_rectangle();

Код: Выделить всё

//rectangle.cpp
#include "rectangle.h"

int Rectangle::area() {return width*height;}

void Rectangle::set_values (int x, int y) {
width = x;
height = y;
}

std::shared_ptr __attribute__((visibility("default"))) get_rectangle() {
return std::make_shared();
}
Я собираю librectangle.so, затем пишу код main.cpp для связи с librectangle.so

Код: Выделить всё

//main.cpp
#include "../rectangle/rectangle.h"

int main() {
auto rectangle = get_rectangle();
rectangle->set_values(2, 3);
rectangle->area();
return 0;
}
Ошибка компиляции

Код: Выделить всё

undefined reference to `Rectangle::set_values(int, int)'
undefined reference to `Rectangle::area()'
Но если я изменю функцию-член класса на виртуальную функцию, она скомпилируется правильно

Код: Выделить всё

//changed rectangle.h
#pragma once

#include 

class Rectangle {
int width, height;
public:
virtual void set_values (int,int);
virtual int area();

};

std::shared_ptr __attribute__((visibility("default"))) get_rectangle();
Использоватьнм -C

Код: Выделить всё

librectangle.so
для сравнения обычного класса функции и класса виртуальной функции. Слева — обычный класс функций. справа — класс виртуальной функции.

Код: Выделить всё

nm -C librectangle.so | grep Rectangle
Изображение

Код: Выделить всё

nm -C librectangle.so | grep area
Изображение

Код: Выделить всё

nm -C librectangle.so | grep set_values
Изображение
обе демо добавляют

Код: Выделить всё

-visibility=hidden
, the normal functions compile incorrectly, but the virtual functions compile correctly?[/b]


Источник: https://stackoverflow.com/questions/781 ... ncorrectly
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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