静态链接到libopenblas

时间:2018-02-23 13:43:08

标签: c++ static openblas

我正在使用C++编译-static程序,以便我可以将我的程序带到服务器并运行它。服务器没有安装我正在链接的所有库,并且在尝试运行程序时,我收到libopenblas.so.0无法找到的错误,因为OpenBLAS未安装:

error while loading shared libraries: libopenblas.so.0: cannot open shared object file: No such file or directory

我需要OpenBLAS用于线性代数库Armadillo并使用标志进行编译

-std=c++11 -static -pthread -Ofast -march=native -mtune=native -m64 -Wall -Werror -Wextra -Wno-long-long -Ishared_methods -Icreate_codes/source_files -Ievaluate_codes/source_files -Igenomes/source_files -lopenblas -llapack -lgfortran

因此无法静态链接OpenBLAS或我做错了什么?

编辑:这是我的makefile。为简单起见,我删除了其他程序的命令和定义。

CXX =       h5c++

CXXFLAGS=   -std=c++11 -static -pthread -Ofast -march=native -mtune=native -m64 -Wall -Werror -Wextra -Wno-long-long -Ishared_methods -Ievaluate_codes/source_files

ENDFLAGS = -lopenblas -llapack -lgfortran

RELDIR_E =  ./evaluate_codes/source_files
RELDIR_M =  ./shared_methods

HEADERS =       $(RELDIR_M)/methods.h   

SRCS_E_MIR =    $(RELDIR_E)/mir.cpp \
        $(RELDIR_M)/methods.cpp

OBJS_E_MIR =    $(SRCS_E_MIR:.cpp=.o)

TARGET_E_MIR = evaluate_codes/mir.out

e_mir:  $(OBJS_E_MIR) 
$(CXX) $(LDFLAGS) $(OBJS_E_MIR) $(LIBS) -o $(TARGET_E_MIR) $(ENDFLAGS)

clean_e_mir:
rm -f $(OBJS_E_MIR) $(TARGET_E_MIR)

编辑2:在我的机器上存在所有静态(.a)和共享(.so)库并且程序运行,但是在服务器上我没有所有库。这就是为什么我想要完全静态地构建它,但似乎没有完全包含库的依赖性,如ldd mir.out所示:

linux-vdso.so.1 =>  (0x00007fff74532000)
libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007fe73dbc8000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe73d9ab000)
libsz.so.2 => /usr/lib/x86_64-linux-gnu/libsz.so.2 (0x00007fe73d7a8000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fe73d58e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe73d38a000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe73d008000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe73ccff000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe73cae9000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe73c71f000)
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007fe73c3f4000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe73fc5c000)
libaec.so.0 => /usr/lib/x86_64-linux-gnu/libaec.so.0 (0x00007fe73c1ec000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007fe73bfad000)

那么如何告诉编译器以静态方式包含这些依赖项呢?

0 个答案:

没有答案