2009-02-19 6 views
1

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

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++ wrapper with same name?

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

+0

Уход за предоставлением примера функции-обертки и вызова? –

+0

Эй, бездельник! Какой-либо прогресс? :) – ralphtheninja

ответ

2

Ваши обертки достаточно тонкие, чтобы они были встроены?

+0

Что вы имеете в виду от достаточно тонкого? – rkioji

+0

Функция, которая просто возвращает значение другой функции с аргументами в другом порядке, будет примером «тонкой» обертки. –

0

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

+0

Нет, это не проблема – 2009-02-19 21:33:30

0

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

В Visual C++, заходим в свойства файла, включая ваш opengl.h, в Preprocessor включить опцию "Создать Proprocessed Файл" (/ P)

Это создаст .И файлу

0

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

// Call OpenGL::glFunction(); 
using namespace OpenGL; 
glFunction(); 
0

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

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

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