从 gwan/libraries 中的 C 库链接另一个库导致 "undefined symbol" 错误

Linking another library from C-library in gwan/libraries results in "undefined symbol" error

我正在尝试在我的 C 库文件中使用标准库 libuuid my_uuid.c:

gwan/libraries/my_uuid.c:

#include <uuid/uuid.h>
#pragma link "uuid"
void my_uuid_generate(uuid_t uuid)
{
  uuid_generate(uuid);
}

gwan/init.c:

#include <uuid/uuid.h>
#pragma link "uuid"
#pragma link "libraries/my_uuid.c"
int main(int argc, char *argv[])
{
  uuid_t uuid;
  my_uuid_generate(uuid);
  return 0;
}

然而,G-Wan 启动失败并打印如下信息:

Linking ./init.c: undefined symbol: uuid_generate

这应该不是 libuuid 安装或非标准路径的问题,因为这样的 servlet 确实运行成功:

#include <uuid/uuid.h>
#pragma link "uuid"
int main(int argc, char *argv[])
{
   uuid_t uuid;
   char str[256];

   uuid_generate(uuid);
   uuid_unparse(uuid, str);
   printf("%s\n", str);

   xbuf_cat(get_reply(argv), "Hello, World!");
   return 200;
}

问题可能是由于 G-Wan 首先加载 init.c 然后 my_uuid.c 而不是 libuuid,即使我有 #pragma link "uuid" init.c.

有人知道如何解决这个问题吗? gwan/libraries 中的 C 文件库中的 link 其他库是否被认为有效?

servlet 之所以有效,是因为您 link 将脚本直接写入现有库(已编译代码)。

init.c脚本无法link,因为调用已编译库的"#pragma link "libraries/my_uuid.c"库尚不存在(它仍然是源代码)。

您应该在 init.c 中使用 #include "libraries/my_uuid.c" 来使这种构造起作用。

我阅读了 GWAN 的文档。如果您编写自己的库,您应该能够与它很好地集成(将其视为一个预先存在的库)。

myuuid.h
myuuid.c

然后通过编译生成你的库 myuuid.c:

libmyuuid.a

将库作为 gwan/libraries/libuuid.a 并尝试如下。

#include "myuuid.h"
#pragma link "./libraries/myuuid"

int main(int argc, char *argv[])
{
    my_uuid_generate();
    return 0;
}

您可能需要关注 gwan/logs/gwan.log 文件以查看 link 是否有效。您也可以在终端中手动启动 GWAN 服务器以查看错误。

有趣的是,当我将#pragma link "uuid" 移动到 init.c 文件中的 #pragma link "libraries/my_uuid.c" 下方时,G-Wan 成功启动:

#include <uuid/uuid.h>
#pragma link "libraries/my_uuid.c"
#pragma link "uuid"
int main(int argc, char *argv[])
{
  uuid_t uuid;
  my_uuid_generate(uuid);
  return 0;
}

确实,它改变了G-Wan加载libuuid和my_uuid.c的顺序。现在它首先加载 libuuid(使用 uuid_generate() 符号),然后加载 my_uuid.c(使用 my_uuid_generate() 符号,后者依次调用 uuid_generate())。

Gil,我是否正确理解当前 G-Wan 的设计目的不是提供可控的库加载顺序? G-Wan 团队是否可以考虑更新 G-Wan 服务器以至少在某种程度上以 controllable/predicatable 顺序加载库? IE。在依赖用户之前加载依赖项。 例如我们应该可以编写如下代码,G-Wan 服务器首先加载 libuuid,然后是 my_uuid.c,然后是 init.c:

gwan/libraries/my_uuid.c:

#pragma link "uuid"

gwan/init.c:

#pragma link "libraries/my_uuid.c"

(注意init.c中没有#pragma link "uuid")