从 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")
我正在尝试在我的 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")