链接gwan / libraries中C库中的另一个库会导致“未定义符号”错误

时间:2016-09-10 10:58:37

标签: g-wan

我正在尝试在我的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文件库链接其他库是否有效?

3 个答案:

答案 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中)