【问题标题】:g-wan: building library outside of /csp, and g++ compilation problemsg-wan:在 /csp 之外构建库,以及 g++ 编译问题
【发布时间】:2012-12-24 00:21:13
【问题描述】:

我正在试一试Gwan。

通过示例代码完成后,我开始了一个包含多个源文件的小项目。我现在有两个问题:

  1. 服务器启动时出现链接错误:

    链接main.cpp:未定义符号:_ZN7GwanUrl9concatAllEv

(主文件#包括其他两个文件;所有文件都在csp目录下)

  1. 作为将所有文件都放在 /csp 目录中的替代方法,我想在 /csp 目录之外创建一个库,同时仍然使用一些 gwan 函数。可悲的是,大量错误随之而来——当我从命令行而不是通过 G-WAN Startup 进行 GCC 时。

    在 /home/ec2-user/gwan/include/gwan.h:22 包含的文件中, 来自 Xbufstream.h:10, 来自 Xbufstream.cpp:10: /usr/include/time.h:199:错误:“size_t”没有命名类型 .....

有人知道 gwan g++ 参数字符串是什么样的吗?

(在编辑器中将 1. 和 1. 与它的 1. 和 2. 相异)

【问题讨论】:

  • 仍然没有得到它。我确实想使用 G-WAN 符号。例如,假设我想:Xbufstream& Xbufstream::operator<<(const char& c) { xbuf_xcat(xbuffer, "%c", c); return *this; }

标签: include g++ pragma g-wan


【解决方案1】:

首先,这不是链接器问题:您的错误是 "undefined symbol" 而不是 "unresolved symbol"

这只是一个#include 问题。

  1. 在您的 script.cpp 文件中定义 main() 函数。

  2. 有一个名为/gwan/include 的专用于用户定义的包含文件的 G-WAN 文件夹,但如果您使用正确的语法,您也可以使用 /csp/my_include.hpp...:

例如,在 /csp/hello.cpp 中包含 #include "toto.hpp" 让我可以在 gwan/include/toto.hpp 文件中定义和实现 C++ 函数(或在 toto.hpp 中定义并实现在使用#pragma link 链接到您的脚本的预编译库中。

如果您更愿意使用#include <toto.hpp>,则系统会改为搜索 SYSTEM INCLUDE PATH(如果您的库已正确安装,这将起作用)。

如果您想将#include "toto.hpp" 用于系统中未设置的自定义文件夹,您可以使用G-WAN 的#pragma include "../my_folder" 指令来指定其路径,或者您可以在每个包含中明确指定它:#include "../my_folder/toto.hpp" .

没什么特别的,只有 C/C++ 依赖规则适用(G-WAN 通过提供不涉及系统设置的替代方式确实很有帮助)。

对于库(请参阅 SQLite、Cairo、mySQL、cURL 等的 G-WAN 示例),您可以使用在 SYSTEM 变量中导出其位置的预安装库...或将您的库放在 @987654331 @ 文件夹及其在/gwan/include 文件夹中的包含文件。

在编写自己的库时,请记住它们需要进行预编译。这意味着您显然不能使用 G-WAN 符号,因为您的编译器可能 #include "gwan.h" (具有定义)但您的链接器将不知道从哪里可以找到 G-WAN 符号。解决方法是始终使用 G-WAN 脚本中的 G-WAN API。您的自定义库必须是通用的或缓冲打算由 G-WAN 使用的任何有效负载。由于 G-WAN 提供了 set_reply() 调用以让 G-WAN 使用在没有 G-WAN servlet 提供的 reply xbuffer 的情况下构建的持久回复,因此不需要双重复制。

现在,关于linking 的最后一句话(这不是造成您麻烦的原因,但可能会造成混乱)。如果您混合使用 C 和 C++,请使用 extern C {} 包装从 C 调用的 C++ 原型(否则您将真的拥有"unresolved symbols")。

有了所有这些信息,您应该准备好面对每一种可能的情况。

【讨论】:

  • 嗨,吉尔。感谢#include 提示。有时,指定 PATH 可能会让人感到困惑。
  • 我在我的库中使用 GWAN 的 JSON 和 KV 存储调用。诀窍是使用函数指针并将它们初始化为 GWAN C 脚本中相应的 GWAN 调用。这种方法的好处是库可能不依赖于 GWAN,并且可以在必要时回退到其他一些 JSON 或 KV 存储实现。
  • Ogla,函数指针初始化(高级用户的复杂方法)最好在连接处理程序的 int() 调用中实现(这在服务器的生命周期中执行一次)。跨度>
  • @Gil 感谢您的回复。并原谅迟到的回应;它的圣诞节。通过上述逻辑#include "toto.hpp" 查找脚本目录csp。 (没有 "../my_folder" )或者 #pragma include "." 无论如何,干杯。
【解决方案2】:

#include 文件中引用 gwan.h 符号的问题也可以通过将所有代码移动到头文件中来解决,无论是 .h 还是 .hpp

它不优雅,但仍然可以解决。对于我想要的简单扩展来说已经足够了。

查看 /libraries/sqlite3/sqlite.h 的帮助。

@gil,感谢您的宝贵时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2013-12-15
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多