我试图在我的c库文件my_uid .c:
中使用标准库液体gwan/图书馆/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无法启动并打印这样的消息:
link ./init.c: undefined symbol: uuid_generate
这肯定不是安装或非标准路径的问题,因为这样的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("%sn", str);
xbuf_cat(get_reply(argv), "Hello, World!");
return 200;
}
问题可能是由于G-Wan首先加载init.c,然后my_uuid.c而不是liquid,即使我在init.c中有#pragma link "uuid"。
有谁知道如何解决这个问题吗?它被认为是有效的链接其他库从c文件库在gwan/库?我阅读了GWAN的文档。如果您编写自己的库,您应该能够与它很好地集成(将其视为预先存在的库)。
myuuid.h
myuuid.c
然后生成你的库,通过编译myuuid.c:
libmyuuid.a
将库放在gwan/libraries/libuid下。A,并按如下方式尝试。
#include "myuuid.h"
#pragma link "./libraries/myuuid"
int main(int argc, char *argv[])
{
my_uuid_generate();
return 0;
}
您可能需要密切关注gwan/logs/gwan.log文件,以查看链接是否有效。您还可以在终端中手动启动GWAN服务器,以查看错误。
servlet
可以工作,因为您将脚本直接链接到现有的库(已经编译的代码)。
init.c
脚本链接失败,因为"#pragma link "libraries/my_uuid.c"
库调用编译库不存在(它仍然是源代码)。
你应该在init.c
中使用#include "libraries/my_uuid.c"
来让这种结构工作。
有趣的是,当我将init.c文件中的#pragma link "uuid"移到#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加载liquid和my_uid .c的顺序。现在,它首先加载liuid(使用uuid_generate()符号),然后加载my_uuid_generate()符号,然后再调用uuid_generate())。
Gil,我是否正确理解当前的G-Wan不是为了提供可控制的库负载顺序而设计的?G-Wan团队是否可以考虑更新G-Wan服务器,以便至少在某种程度上以可控/可预测的顺序加载库?即,在依赖项用户之前加载依赖项。例如,我们应该能够编写如下代码,并让G-Wan服务器首先加载liquid,然后是my_uid .c,然后是init.c:
gwan/图书馆/my_uuid.c:
#pragma link "uuid"
gwan/init.c:
#pragma link "libraries/my_uuid.c"
(注意init.c中没有#pragma link "uuid")