g-wan:在/ csp之外构建库,以及g ++编译问题

时间:2012-12-24 00:21:14

标签: include g++ pragma g-wan

我正在给Gwan一个旋转。

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

  1. 我在服务器启动时遇到链接错误:

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

  2. (主文件#includes另外两个文件;所有文件都在csp目录中)

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

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

    2. 任何人都知道gwan g ++参数字符串是什么样的?

      (奇数1.和1.编辑中的1.和2.)

2 个答案:

答案 0 :(得分:1)

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

这只是#include问题。

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

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

  3. 例如,在/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"指令指定其PATH,或者您可以在每个包含中明确指定它:#include "../my_folder/toto.hpp"

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

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

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

    现在,关于reply xbuffer的最后一句话(这不是你的麻烦的原因,但可能参与混乱)。如果你混合C和C ++,使用linking来包装从C调用的C ++原型(否则你真的extern C {})。

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

答案 1 :(得分:0)

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

尽管如此,它仍然是一种不合理的解决方案。对于我想要的简单扩展来说已经足够了。

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

@gil,谢谢你的时间。