Использовать 32-битную разделяемую библиотеку из 64-битного приложения?

Я создал простую 32-битную разделяемую библиотеку Linux (.so) для своих оболочек рендеринга, но я столкнулся со стеной, когда понял, что могу только использовать их через 32-битные приложения ....................

Вот как выглядит мой код:

RendIFace.h:

<code>//Basic renderer interface
struct Renderer
{
    int type;
    ...other things
};
</code>

GLRend.c:

<code>#include "RendIFace.h"
struct Renderer* GLRendererCreate(int width,int height,int bytesPerPixel)
{
    struct Renderer* rend = (struct Renderer*)malloc(sizeof(Renderer));

    rend->type = GLR;
    ..other things

    return rend;
}
</code>

SDLRend.c:

<code>#include "RendIFace.h"
struct Renderer* SDLRendererCreate(int width,int height,int bytesPerPixel)
{
    struct Renderer* rend = (struct Renderer*)malloc(sizeof(Renderer));

    rend->type = SDLR;
    ..other things

    return rend;
}
</code>

И я компилирую как общие 32-битные библиотеки (.so) и загружаю их через основное приложение ...

Но теперь есть большая проблема. Мои библиотеки все 32-битные и возвращают 32-битные указатели, что означает, что я не могу использовать их через 64-битное приложение без перестройки всей базы кода библиотеки (!!!).

Поэтому я хотел бы спросить более опытных людей: как мне решить эту проблему? Можно ли использовать только одну общую библиотеку для обеих архитектур ???

 user101000506 апр. 2012 г., 07:42
Я пишу и приложение, и библиотеку ...
 user16639006 апр. 2012 г., 07:18
Я не думаю, что это сработает. DLL / SO загруженinto процесс программы. Я никогда не видел / не слышал о том, как он работает, когда разность битов отличается (поскольку 32-битный IA32 сейчас пытается работать в 64-битном контексте AMD64 и, между прочим, CC, вероятно, отличается).
 Java4206 апр. 2012 г., 07:31
Вы также пишете приложение? или только библиотека?

Ответы на вопрос(2)

Решение Вопроса

Вы должны быть последовательными. 64-разрядное приложение может использовать только 64-разрядные библиотеки, а 32-разрядное приложение может использовать только 32-разрядные библиотеки. Обе работают; любой выбор приемлем, и можно компилировать один и тот же код для обеих систем.

Если вы выбрали «все 32-битные», используйте:

gcc -m32

Если вы выбираете «все 64-битные», используйте:

gcc -m64

Иногда я скажуmake что компилятор Cgcc -m32 (или же-m64) а не простоgcc чтобы обеспечить правильное значение используется везде.

 user101000506 апр. 2012 г., 11:16
Спасибо. Думаю, мне следует перейти на статические библиотеки.
 06 апр. 2012 г., 16:10
Независимо от того, используете ли вы статические или разделяемые библиотеки, вам все равно придется соблюдать согласованность и собирать их либо все 32-разрядные, либо все 64-разрядные. Вы не можете смешивать 32-битный и 64-битный код в одном исполняемом файле.

Вы не можете делать то, что просите. Вы должны скомпилировать как конечный исполняемый файл, так и любые библиотеки (как статические, так и общие) для одной и той же архитектуры.

В GCC это легко сделать, передав аргумент командной строки-m32 либо непосредственно в командной строке, либо добавив егоCCFLAGS в вашемMakefile.

Хотя можно запустить код x86 в операционной системе x86_64 (вам просто нужно иметь все нужные библиотеки и соответствующие им рекурсивные зависимости), вы не можете в одном исполняемом файле или в одном адресном пространстве комбинировать двоичные файлы x86 и x86_64.

 user101000506 апр. 2012 г., 11:18
Спасибо за ваш ответ. Думаю, я превращу свои динамические библиотеки в статические ...
 06 апр. 2012 г., 16:05
Я думаю, вы упускаете суть. Даже статические библиотеки скомпилированы для 64 или 32 бит.

Ваш ответ на вопрос