我正在尝试在我的C库文件my_uuid.c中使用标准库libuuid:
金桂冠/库/ my_uuid.c:
#include <uuid/uuid.h>
#pragma link "uuid"
void my_uuid_generate(uuid_t uuid)
{
uuid_generate(uuid);
}
金桂冠/ 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无法启动并打印出这样的消息:
链接./init.c:未定义的符号: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,即使我在init.c中有#pragma link“uuid”。
有人知道如何解决这个问题吗? 从gwan / libraries中的C文件库链接其他库是否有效?
答案 0 :(得分:1)
我阅读了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文件以查看链接是否有效。您也可以手动启动终端中的GWAN服务器以查看错误。
答案 1 :(得分:0)
servlet
有效,因为您将脚本直接链接到现有库(已编译的代码)。
init.c
脚本无法链接,因为调用已编译库的"#pragma link "libraries/my_uuid.c"
库尚不存在(它仍是源代码)。
您应该在#include "libraries/my_uuid.c"
中使用init.c
来使这种结构有效。
答案 2 :(得分:0)
有趣的是,G-Wan在我移动#pragma link&#34; uuid&#34;在#pragma链接&#34; libraries / my_uuid.c&#34;在init.c文件中:
#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())。
吉尔,我是否正确理解目前G-Wan不是为了提供可控的库加载顺序而设计的? G-Wan团队是否可以考虑更新G-Wan服务器以至少在某种程度上以可控/可预测的顺序加载库?即在依赖项用户之前加载依赖项。 例如,我们应该能够编写如下代码和G-Wan服务器来加载第一个libuuid,然后是my_uuid.c,然后是init.c:
金桂冠/库/ my_uuid.c:
#pragma link "uuid"
金桂冠/ INIT.C:
#pragma link "libraries/my_uuid.c"
(注意没有#pragma链接&#34; uuid&#34;在init.c中)