Связывание libpng с g ++ - PullRequest
       5

Связывание libpng с g ++

0 голосов
/ 28 сентября 2010

Я пытаюсь заставить libpng работать на Linux. Я не мог заставить его работать через netbeans, поэтому я запустил g ++ напрямую как g++ -lpng -lz main.cpp -o test и он компилируется. Когда я пытаюсь запустить его, он выдает ./test: error while loading shared libraries: libpng14.so.14: cannot open shared object file: No such file or directory. Я предполагаю, что это означает, что я связываюсь динамически, и это не может найти .so файл

~/Programs/NetBeansProjects/DiamondSquare$ ldd test linux-gate.so.1 => (0x008a5000) libpng14.so.14 => not found libz.so.1 => /usr/local/lib/libz.so.1 (0x00209000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x0094b000) libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00e3a000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00927000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00220000) /lib/ld-linux.so.2 (0x00b85000)

Во-первых, я не хотел динамически связываться. Как я могу решить это?

Я знаю, что libpng14.so.14 также находится в / usr / local / lib, если это имеет значение.

Дополнительные очки, если вы можете сказать мне, как сделать это в NetBeans.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Странно, что g ++ может найти библиотеку, но test не может (вы можете сказать, что g ++ может найти ее, потому что test определенно ожидает libpn14, даже если вы говорите только g ++ '-lpng'). Вы уверены, что не передаете флаги -L или -R в g ++? Переменные среды LD_PRELOAD или LD_LIBRARY_PATH установлены в оболочке, в которой вы запускаете g ++, но не в оболочке, в которой вы запускаете тест? Вы можете указать LD_PRELOAD на определенную общую библиотеку, чтобы указать приложению или g ++, как его найти, и любые папки в LD_LIBRARY_PATH будут автоматически найдены.

Также для ссылки на libpng статически ставьте "-Wl, -Bstatic" перед "-lpng." Осторожно, любые библиотеки после -Bstatic будут связаны статически. Вы можете переключиться обратно на динамический и перечислить еще несколько библиотек, используя "-Wl, -Bdynamic -lfoo".

0 голосов
/ 28 сентября 2010

Динамическое связывание является значением по умолчанию и должно быть предпочтительным в целом. Вы говорите, что libpng находится в / usr / local / lib, вы действительно уверены в этом? Он находит /usr/local/lib/libz.so.1. Если libpng14.so.14 находится в / usr / local / lib, он также должен найти его.

...