gpt4 book ai didi

c++ - 静态链接到 libopenblas

转载 作者:行者123 更新时间:2023-11-30 02:21:04 29 4
gpt4 key购买 nike

我正在使用 -static 编译一个 C++ 程序,这样我就可以将我的程序带到服务器上并运行它。服务器没有安装我正在链接的所有库,当我尝试运行该程序时,我收到错误消息 libopenblas.so.0 cannot be found 因为 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)

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

最佳答案

您的 -static 选项无效。

您没有编写编译源文件的规则。您允许使用 make 的 built-in rule 编译它们:

%.o:%.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $@ S<

其中:-

  • $(CXX) 扩展为您定义的或默认的 C++ 编译器
  • $(CPPFLAGS) 扩展为您定义的预处理器标志
  • $(CXXFLAGS) 扩展为您定义的 C++ 编译器标志

您已经定义:

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

所以-static被内置的传递给编译命令食谱。但是,它不是一个编译选项。它是一个链接选项。它在编译中被忽略。您不将其传递给链接命令。所以没有影响。

另外两个重要的 make 变量具有常规意义 make(并被使用具有内置规则中的那些含义)是:

  • LDFLAGS 被定义为你的链接选项,不包括库选项(-lfoo) 和明确命名的库
  • LDLIBS 将被定义为您的库选项和明确命名的库。

所以 -static 是一个链接选项,应该正确地包含在 LDFLAGS 的值中,而不是 CXXFLAGS

在许多方面,您的 makefile 偏离了正常做法并建议您可能还不是很了解 GNU Make。如果挑出来不切实际这里所有的绒毛。您的链接配方是:

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

将导致 -static 的最小(虽然不是最好)一组更正在联动中生效的选项是:

  • CXXFLAGS 的定义中移除 -static
  • 将其添加到ENDFLAGS的定义中

注意在联动中成功让-static生效确实并不意味着尝试的静态链接将成功:只是它将是尝试过,现在没有发生。

还要注意,完全静态链接是一个极端的步骤,而且没有必要如果你试图解决的问题仅仅是一些共享您链接的库在目标服务器上不可用。

-static 的效果是要求所有库的静态版本链接所需的必须通过您的链接找到。不只是你的:

-lopenblas -llapack -lgfortran

还有链接的 C 运行时库和标准 C++ 库默认情况下,加上 -pthread 请求的 Posix 线程库。您是否安装了所有这些的静态版本?

如果你只需要链接,比方说,libopenblasliblapack 的静态版本,你有在您的系统上安装 libopenblas.a liblapack.a 以便链接器将在其默认搜索目录中找到它们,然后您只需更改:

-lopenblas -llapack -lgfortran

到:

-l:libopenblas.a -l:liblapack.a -lgfortran

-lname 指示链接器搜索指定的 (-Ldir) 或libname.so(共享库)或 libname.a 的默认搜索目录(静态库)并且如果在同一目录中找到两者,则更喜欢 libfoo.so-l:name 指示链接器搜索具有确切名称 name 的文件。因此,通过指定 -l:libopenblas.a,您可以请求 libopenblas.a 的链接没有比这更大的影响了。

关于c++ - 静态链接到 libopenblas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48949207/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com