测试Netezza UDX时出现未定义的符号错误

时间:2014-04-09 07:17:26

标签: undefined symbols netezza

我正在尝试通过Rserve实现使用R language的Netezza UDX(因此我使用Rconnection库进行C ++)。目前,我只编写了UDX运行所需的最低限度。

看起来如下:

#define MAIN

// Netezza UDX libraries
#include "udxinc.h"
#include "udxhelpers.h"

// C++ libraries
#include <cstdlib>
#include <cstring>

// external Rserve and R headers
#include "Rconnection.h"
#include "sisocks.h"

using namespace nz::udx::dthelpers;
using namespace nz::udx_ver2;

// extends UDF base class
class My_UDX : public Udf {     

    public:
        Rconnection * rc;

        My_UDX(UdxInit *pInit) : Udf(pInit) {
            initsocks();
            // IP address in place of ...
            rc = new Rconnection("...", 6311);
        };

        ~My_UDX() {
            delete rc;
        }

        static Udf* instantiate(UdxInit *pInit);

        virtual ReturnValue evaluate();
};

Udf* My_UDX::instantiate(UdxInit *pInit) {
    return new My_UDX(pInit);
}

// called once for each row of data during execution
ReturnValue My_UDX::evaluate() {

    int32 retval = 15;

    NZ_UDX_RETURN_INT32(retval);
}

当我尝试使用SQL查询测试UDX时出现问题。我的查询如下:

SELECT * FROM table_name WHERE My_UDX(table_field) = 1;

这是我收到的错误消息:

Testing...
nzsql -d database_name -u my_username -pw my_password -f sql/test.sql
nzsql:sql/test.sql:1: ERROR:  /dev/shm/spuplans/63_1_3.o: undefined symbol: _ZN11RconnectionC1EPKci : loading executable code
make: *** [update] Error 2

如果删除Rconnection对象,UDX可以正常工作。

我已经检查了有关Netezza UDX,Rserve和Rconnection的不同手册,但没有结果。无法找到对此错误的任何解释以及可以采取哪些措施来解决此问题。

然后我假设编译过程可能有问题,包含所需的库和标志。我不熟悉makefile,所以这很有可能。我的makefile看起来像这样:

# list of files
function_name   = My_UDX
object_files    = $(function_name).o_x86
spu_files       = $(function_name).o_spu10

# database connection
db_call = nzsql -d database_name -u my_username -pw my_password -f

# path to directories
lib_dir             = /home/nz/libs
r_connection_dir    = /home/nz/Rconnection

all: update

update: compile
    $(db_call) sql/unload.sql
    cp $(object_files) $(lib_dir)
    cp $(spu_files) $(lib_dir)
    rm -f *.o_spu10 *.o_x86
    $(db_call) sql/create.sql
    $(db_call) sql/test.sql

compile:
    nzudxcompile $(function_name).cpp --args -I$(r_connection_dir)

unload.sql只删除以前加载的函数,create.sql只是创建它。只有在执行带有先前显示的SQL查询的test.sql时才会出现问题。

一直试图解决这个问题很长一段时间,所以任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

如上所述,Alex必须将Rconnection作为共享库加载或与UDF一起编译。通过使用UDF进行编译解决了这个问题。

# for host environment
nzudxcompile --host Rconnection.cpp -o temp_rconnection.o_x86
nzudxcompile --host myudf.cpp -o temp_myudf.o_x86
nzudxcompile --host --objs temp_rconnection.o_x86 --objs temp_myudf.o_x86 -o myudf.o_x86

# for spu environment
nzudxcompile Rconnection.cpp --spu -o temp_rconnection.o_spu10
nzudxcompile myudf.cpp --spu -o temp_myudf.o_spu10
nzudxcompile --spu --objs temp_rconnection.o_spu10 --objs temp_myudf.o_spu10 -o    myudf.o_spu10