1

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)

私の 2 つのファイル (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

-Wl,-rpath,$(HWLOC_ROOT)/lib を使用して、コンパイル時に lib のランタイム パスを強制できます (これは、gcc が "-rpath $(HWLOC_ROOT)/lib" をリンカーに渡すことを意味します)。良いアイデア。

于 2013-06-16T17:18:53.397 に答える
1

これが LD_LIBRARY_PATH の目的です。非標準の場所 (つまり、/usr/lib、/usr/local/lib などではない場所) に共有ライブラリがある場合、ダイナミック ローダーはそれらの場所を知る必要があります。これに対処するには、主に 2 つの方法があります。頻繁に使用されない 1 回限りのライブラリ、またはプログラムの数が少ない場合は、ユーザーの LD_LIBRARY_PATH を設定して、ライブラリが存在するディレクトリを含めるだけで十分です。より広く使用するには、ローダーが認識しているディレクトリのリストにそのディレクトリを追加することで、そのディレクトリを「標準」ディレクトリの 1 つにすることが/etc/ld.so.conf.dでき/etc/ld.so.confますldconfig。これにより、すべてのユーザーとプログラムのシステム全体の検索パスにそのディレクトリが追加されるため、潜在的な競合に注意してください。

于 2013-06-14T18:26:30.053 に答える