C++ Hadoop管道找不到共享库

C++ Hadoop管道找不到共享库,c++,compilation,hadoop,dynamic-linking,static-linking,C++,Compilation,Hadoop,Dynamic Linking,Static Linking,我在运行hadoop pipes程序时遇到此错误程序编译成功,但在hadoop管道上失败。 error while loading shared libraries: Lib.so.0: cannot open shared object file: No such file or directory 生成文件: CC = g++ HADOOP_PATH = usr/lib/HADOOP OTHERLIB1_PATH = usr/lib/OTHERLIB1 OTHERLIB2_PATH = u

我在运行hadoop pipes程序时遇到此错误程序编译成功,但在hadoop管道上失败。

error while loading shared libraries: Lib.so.0: cannot open shared object file: No such file or directory
生成文件:

CC = g++
HADOOP_PATH = usr/lib/HADOOP
OTHERLIB1_PATH = usr/lib/OTHERLIB1
OTHERLIB2_PATH = usr/lib/OTHERLIB2
OTHERLIB3_PATH = usr/lib/OTHERLIB3
OTHERLIB4_PATH = usr/lib/OTHERLIB4
IMAGE_PATH = usr/lib/IMAGE
LIB_PATH = ../../../src/Lib
PLATFORM = Linux-amd64-64

CFLAGS_HDP =  -O3 \
        -I$(LIB_PATH) \
        -I$(OTHERLIB1_PATH)/include \
        -I$(HADOOP_PATH)/$(PLATFORM)/include \
        -I$(OTHERLIB4_PATH)/include \
        -I$(OTHERLIB2_PATH)/include \
        -I$(OTHERLIB3_PATH)/include 

LDFLAGS_HDP =   -L$(OTHERLIB1_PATH)/lib \
        -L$(HADOOP_PATH)/$(PLATFORM)/lib \
        -L$(OTHERLIB3_PATH)/lib \
        -L$(OTHERLIB2_PATH)/lib \
        -L$(OTHERLIB4_PATH)/lib \
        -L$(LIB_PATH)/.libs \
        -lhadooppipes -lhadooputils -lpthread -lcrypto\
        -lLib -lLib4 -lLib1

all: pipes clean 

clean:
        rm  *.o

pipes: LibPipes.cpp xml DocToXml
    $(CC) $(CFLAGS_HDP) \
    LibPipes.cpp \
    -o Lib_Pipes base64.o \
    xml.o DocToXml.o $(LDFLAGS_HDP)


xml: xml.cpp base64
        $(CC) $(CFLAGS_HDP) base64.o -c xml.cpp -o xml.o

base64: base64.cpp
        $(CC) $(CFLAGS_HDP) -c base64.cpp -o base64.o

DocToXml: DocToXml.cpp
        $(CC) $(CFLAGS_HDP) -c DocToXml.cpp -o  DocToXml.o
我使用以下命令在hadoop上运行该程序:

hadoop pipes \
-D hadoop.pipes.java.recordreader=false \
-D hadoop.pipes.java.recordwriter=false \
-D mapred.map.tasks=128 \
-inputformat org.apache.hadoop.mapred.SequenceFileInputFormat \
-writer org.apache.hadoop.mapred.SequenceFileOutputFormat \
-reduce org.apache.hadoop.mapred.lib.IdentityReducer \
-input Input \
-output Output \
-program /user/uss/bin/Lib_Pipes \
-reduces 1

这似乎是动态链接导致的问题。我已经尝试使用-files标志将库提供给hadoop。还尝试使用不同的编译标志(如-static、-Bstatic、-static libgcc、-static libstdc++)静态链接此程序,但这些也不起作用。有人知道如何在hadoop管道上处理这种类型的二进制文件吗?任何帮助都将不胜感激。

我使用的解决方案是压缩所有外部库,并在管道中使用
-archives
标志

zip -r my.zip lib/
这里的
lib/
包含了所有的
。因此
文件是你想要链接的

编辑

还要将
-rpath my.zip/lib
添加到
LDFLAGS\u HDP
。要使编译工作正常,还需要执行以下操作

# in src dir
mkdir -p my.zip/lib
/EDIT

然后使用命令运行管道和外接程序

-archives my.zip

解决了问题。它是在-files标志后面的一个空格。

没有其他方法解决这个问题吗?也就是说,我们可以静态链接这些库,使整个二进制文件包含所有库吗?看起来静态链接应该可以工作,但您的注释提示它不能工作。我还想看看是否还有其他人使用了静态链接。所以,我应该用.So文件创建一个目录my.zip/lib并将其压缩吗?另外,在运行make时,我得到了一个g++:无法识别的选项'-rpath'。是这样吗?解决了问题。它是在-files标志后面的一个空格。