Проблема компоновщика C ++ с оболочкой - PullRequest
1 голос
/ 20 февраля 2009

У меня есть библиотека opengl.lib, которая содержит функции-оболочки для всех функций opengl. Функции объявлены в их собственном пространстве имен, так что функции-оболочки могут быть названы с тем же именем, что и функции opengl. Таким образом, внутри функции-обертки функция opengl вызывается с помощью :: gl *** ();

opengl.h:
namespace OpenGL {
    void glFunction();
}

opengl.cpp:
void OpenGL::glFunction() {
    ::glFunction();
}

Теперь проблема в том, что когда я использую этот opengl.lib в своем приложении и включаю свой собственный "opengl.h", по какой-то причине реальные функции opengl вызываются напрямую, а не мои функции-оболочки.

Я позаботился о том, чтобы я не включил какой-либо настоящий opengl.h, так что это должно быть какой-то проблемой компоновщика. Как я могу решить это? У меня также есть настоящая библиотека opengl в пути к библиотеке, потому что в противном случае я получаю ошибки компоновщика в моем opengl.lib, поскольку он использует реальные функции opengl. Таким образом, настоящая библиотека opengl и мой opengl.lib каким-то образом смешиваются, и компоновщик решает использовать настоящий opengl.lib вместо моего.

Я знаю, что могу решить эту проблему, переименовав свои функции-оболочки во что-то другое, но я бы хотел использовать те же имена.

Этот вопрос относится к моему предыдущему вопросу Оболочка C ++ с тем же именем?

Я использую Visual C ++ с отключенной оптимизацией.

Ответы [ 5 ]

2 голосов
/ 20 февраля 2009

Являются ли ваши обертки достаточно тонкими, чтобы они были встроены?

0 голосов
/ 11 июля 2011

Проблема не в том, что вы опубликовали, а в вашем вызове. Можете ли вы опубликовать соответствующий код для вызова функции?

OpenGL::glFunction(); будет, как я это сделаю, и это сработает.

0 голосов
/ 19 мая 2009

Вам нужно только связываться с реальной библиотекой opengl, когда вы создаете свой opengl.lib. Убедитесь, что у вас нет ссылок на реальную библиотеку opengl в проектах, которые используют вашу собственную библиотеку. Если у вас нет ссылок на реальную библиотеку, то нельзя вызывать реальные функции. Как только это будет сделано, убедитесь, что вы используете правильное пространство имен.

// Call OpenGL::glFunction();
using namespace OpenGL;
glFunction();
0 голосов
/ 20 февраля 2009

Просмотр предварительно обработанного файла cpp может быть очень полезным для решения этой проблемы.

В Visual C ++ перейдите в свойствах файла, включая ваш opengl.h, в препроцессоре включите опцию «Создать обработанный файл» (/ P)

Это создаст .i файл

0 голосов
/ 20 февраля 2009

Действительно ли файл opengl.h назван так же, как ваш заголовочный файл оболочки? Если это так, то, вероятно, вы включаете его, не осознавая этого, поскольку компилятор ищет системные пути до определенных пользователем путей.

...