1

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

主.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 的位置,因为它与应用程序一起打包。

4

2 回答 2

1

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

于 2013-06-14T18:26:30.053 回答
1

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

于 2013-06-16T17:18:53.397 回答