【问题标题】:Linking error with HWLOC与 HWLOC 的链接错误
【发布时间】:2013-06-14 15:50:00
【问题描述】:

我正在尝试将 hwloc (http://www.open-mpi.org/projects/hwloc/) 链接到我非常基本的应用程序。以下是详细内容

main.cxx:

 #include <hwloc.h>
 #include <stdio.h>

 int main(int argc, char** argv) {
     hwloc_topology_t topology;
     int ncores;

     hwloc_topology_init(&topology);
     hwloc_topology_load(topology);

     ncores = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_CORE);
     printf("Number of cores: %d\n", ncores);

     hwloc_topology_destroy(topology);

     return 0;
 }

生成文件:

 .SUFFIXES: .cxx .o

 CXX  = g++

 TARGET  = tests
 SRCS    = main.cxx

 OBJS   = $(SRCS:.cxx=.o)

 HWLOC_ROOT = $(CURDIR)/hwloc
 HWLOC_INCS = -I$(HWLOC_ROOT)/include
 HWLOC_LIBS = -L$(HWLOC_ROOT)/lib -lhwloc

 FLAGS   = -std=c++0x $(HWLOC_INCS)
 LDFLAGS = $(HWLOC_LIBS)

 %.o : %.cxx
    $(CXX) -c $(FLAGS) $<

 $(TARGET) : $(OBJS)
    $(CXX) -o $@ $^ $(LDFLAGS) -lstdc++

 clean :
    rm -rf *.o $(TARGET)

与我的两个文件(main.cxx 和 Makefile)在同一目录中的是包含 hwloc 的目录。因为我以前用过,所以安装正确。

我可以编译一切就好了。当我运行./tests 时,出现以下错误:

 ./tests: error while loading shared libraries: libhwloc.so.5: cannot open shared object file: No such file or directory

./hwloc 内部:

 bin/  include/  lib/  share/

./hwloc/lib 内部:

 libhwloc.la  libhwloc.so  libhwloc.so.5  libhwloc.so.5.3.1  pkgconfig/

很明显libhwloc.so.5 存在,所以我不确定问题出在哪里。感谢您对我的问题的任何帮助。

编辑:

为了澄清,重点是不必将目录添加到我的路径中。我不想为了让链接器知道 libhwloc.so.5 的位置而必须执行任何命令行命令。目标是能够将我的应用程序的根目录移动到我的计算机或另一台计算机上的任何位置,并且它仍然知道 libhwloc.so.5 的位置,因为它与应用程序一起打包。

【问题讨论】:

  • 要么将./hwloc/lib 添加到用户环境中的路径变量中,要么将libhwloc.so.5 移动到路径中已经存在的目录中(或添加指向它的链接)。
  • @CaptainObvlious 我知道这是一个简单的解决方案,但同时我应该能够在不将其添加到我的路径的情况下使其工作。过去,我在我的应用程序目录中使用了 hwloc(出于可移植性的原因)并且链接没有问题。当然,我不记得/无法访问我之前所做的事情,否则我不会在这里;)

标签: c++ linker makefile runtime-error


【解决方案1】:

这是 LD_LIBRARY_PATH 的用途。如果您在非标准位置(即不是 /usr/lib、/usr/local/lib 等)有共享库,则动态加载程序需要知道在哪里可以找到它们。有两种主要的方法来处理它。对于不经常使用的一次性库或少量程序,将用户 LD_LIBRARY_PATH 设置为包含库所在的目录就足够了。为了更广泛地使用,您可以通过将该目录添加到加载程序知道的目录列表中来使该目录成为“标准”目录之一 - 在 Linux 上,这通常通过编辑 /etc/ld.so.conf.d/etc/ld.so.conf 本身中的文件来完成,然后运行ldconfig。这会将该目录添加到系统范围内所有用户和程序的搜索路径中,因此请注意潜在的冲突。

【讨论】:

  • 那么在编译时用 -L 命令链接有什么意义呢?我想我的问题是为什么做 -L$(HWLOC_LIBS) -lhwloc 不会告诉加载器在哪里找到库。
  • -L 告诉链接器在哪里可以找到库。 LD_LIBRARY_PATH 或ld.so 配置告诉加载器在哪里可以找到库。另一种选择是将库的完整路径嵌入到可执行文件中的编译器/链接器标志,但我不记得那些是什么。
【解决方案2】:

您可以在编译时使用 -Wl,-rpath,$(HWLOC_ROOT)/lib 强制执行 lib 的运行时路径(这意味着 gcc 会将 "-rpath $(HWLOC_ROOT)/lib" 传递给链接器)但仅此而已并不总是一个好主意。

【讨论】:

    猜你喜欢
    • 2022-12-25
    • 1970-01-01
    • 2012-10-23
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多