1

我为我的渲染包装器创建了一个简单的 linux 32 位共享库(.so),但是当我发现我只能通过 32 位应用程序使用它们时,我碰壁了...... ……

这就是我的代码的样子:

RendIFace.h:

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

GLRend.c:

#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;
}

SDLRend.c:

#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;
}

我将它们编译为共享的 32 位库(.so)并通过主应用程序加载它们......

但是现在有一个大问题。我的库都是 32 位的,并返回 32 位指针,这意味着我不能通过 64 位应用程序使用它们而不重建所有库代码库(!!!)。

所以我想问问有经验的人:我如何处理这个问题?两种架构都可以只使用一个共享库吗???

4

2 回答 2

11

你必须保持一致。64 位应用程序只能使用 64 位库,而 32 位应用程序只能使用 32 位库。两者都有效;任何一种选择都可以,并且可以为两个系统编译相同的代码。

如果您选择“所有 32 位”,请使用:

  • gcc -m32

如果您选择“所有 64 位”,请使用:

  • gcc -m64

有时,我会告诉makeC 编译器是gcc -m32(或-m64),而不仅仅是gcc为了确保在任何地方都使用正确的值。

于 2012-04-06T06:33:52.683 回答
4

你不能按照你的要求去做。您必须为同一架构编译最终可执行文件和任何库(静态库和共享库)。

在 GCC 上,这可以通过-m32直接在命令行中传递命令行参数或将其添加CCFLAGS到您的Makefile.

虽然可以在 x86_64 操作系统上运行 x86 代码(您只需要拥有所有正确的库及其各自的递归依赖项),但您不能在一个可执行文件或一个地址空间中组合 x86 和 x86_64 二进制文件。

于 2012-04-06T06:29:41.210 回答