2013-06-14 3 views
0

Я пытаюсь связать hwloc (http://www.open-mpi.org/projects/hwloc/) с моим самым простым приложением. Ниже приведены подробные сведенияОшибка связи с 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; 
} 

Makefile:

.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 [email protected] $^ $(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 существует поэтому я не уверен, в чем проблема. Я ценю любую помощь по моей проблеме.

Edit:

Чтобы уточнить, дело в том, чтобы не иметь, чтобы добавить каталог в моем пути. Я не хочу выполнять какие-либо команды в командной строке, чтобы компоновщик знал, где найти libhwloc.so.5. Цель состоит в том, чтобы иметь возможность перемещать корневую директорию моего приложения в любом месте на моем компьютере или другом компьютере, и он все еще знает, где найти libhwloc.so.5, так как он упакован вместе с приложением.

+0

Либо добавьте './Hwloc/lib' в переменную пути в пользовательскую среду, либо переместите' libhwloc.so.5' в каталог, уже находящийся в пути (или добавьте ссылку на него). –

+0

@CaptainObvlious Я знаю, что это простое решение, но в то же время я должен иметь возможность заставить его работать, не добавляя его на мой путь. Раньше я использовал hwloc в своем каталоге приложений (по соображениям переносимости) и не имел проблем с привязкой. Конечно, я не помню/не имею доступа к тому, что я делал раньше, иначе я бы не был здесь;) –

ответ

2

Это назначение для LD_LIBRARY_PATH. Если вы используете общие библиотеки в нестандартных местах (например, not/usr/lib,/usr/local/lib и т. Д.), Динамический загрузчик должен знать, где их найти. Есть два основных способа борьбы с этим. Для одноразовых библиотек, которые используются нечасто или для небольшого числа программ, достаточно указать пользователям LD_LIBRARY_PATH каталог, в котором находится библиотека. Для более широкого использования вы можете сделать этот каталог одним из «стандартных», добавив его в список каталогов, о которых ваш загрузчик знает - на Linux, который обычно выполняется путем редактирования файлов в /etc/ld.so.conf.d или /etc/ld.so.conf, а затем выполняется ldconfig. Это добавит этот каталог в путь поиска по всей системе для всех пользователей и программ, поэтому остерегайтесь потенциальных конфликтов.

+0

Тогда что же касается ссылки во время компиляции с помощью команды -L? Думаю, мой вопрос в том, почему -L $ (HWLOC_LIBS) -lhwloc не сообщает загрузчику, где найти библиотеку. –

+0

'-L' сообщает компоновщику, где можно найти библиотеку. LD_LIBRARY_PATH или конфигурация 'ld.so' сообщают загрузчику, где можно найти библиотеку.Другой альтернативой являются флаги компилятора/компоновщика, которые вставляют полный путь библиотеки в исполняемый файл, но я не помню, что это за пределами моей головы. – twalberg

1

Вы можете принудительно установить путь выполнения во время компиляции с помощью -Wl, -rpath, $ (HWLOC_ROOT)/lib (что означает, что gcc передаст ссылку -rpath $ (HWLOC_ROOT)/lib "в компоновщик), но это не всегда хорошая идея.

+0

Не могли бы вы прокомментировать, когда/почему это не будет хорошей идеей? –

Смежные вопросы