我正在给Gwan一个旋转。
通过示例代码完成后,我启动了一个包含多个源文件的小项目。我现在有两个问题:
我在服务器启动时遇到链接错误:
链接main.cpp:未定义的符号:_ZN7GwanUrl9concatAllEv
(主文件#includes另外两个文件;所有文件都在csp目录中)
作为将所有文件放在/ 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'没有命名类型 .....
任何人都知道gwan g ++参数字符串是什么样的?
(奇数1.和1.编辑中的1.和2.)
答案 0 :(得分:1)
首先,这不是链接器问题:您将"undefined symbol"
而非"unresolved symbol"
视为错误。
这只是#include
问题。
在script.cpp文件中定义main()函数。
有一个G-WAN文件夹,专门用于名为/gwan/include
的用户定义包含文件,但如果使用正确的语法,也可以使用/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"
指令指定其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,谢谢你的时间。