1

我让 Gwan 试一试。

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

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

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

(主文件#includes另外两个文件;所有文件都在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. 在编辑器中)

4

2 回答 2

1

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

这简直是​​个#include问题。

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

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

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

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

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

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

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

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

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

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

于 2012-12-24T08:02:43.653 回答
0

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

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

调查 /libraries/sqlite3/sqlite.h 有帮助。

@gil,感谢您抽出宝贵时间。

于 2012-12-28T17:51:38.820 回答