我正在使用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)
那么如何告诉编译器以静态方式包含这些依赖项呢?