Общая библиотека не найдена в /usr/локальная/lib

#compilation #shared-libraries #ld

Вопрос:

Подобные вопросы задавали много, но я все еще не совсем понимаю, что не так с тем, как я скомпилировал и установил свою общую библиотеку.

Что касается компиляции, я делаю

 > gcc -c -fPIC libt.c
> gcc -shared -Wl,-soname,libt.so.0 -o libt.so.0.1 libt.o
 

Чтобы установить библиотеку, я запускаю

 > cp libt.so.0.1 /usr/local/lib/
> cp libt.h /usr/local/include/
> ln -s /usr/local/lib/libt.so.0.1 /usr/local/lib/libt.so.0 # ldconfig would setup this symlink itself ...
> ln -s /usr/local/lib/libt.so.0 /usr/local/lib/libt.so # ... but not this one, so I do it myself
> sudo ldconfig
 

/usr/local/lib включен в /etc/ld.so.conf.d/libc.conf и ldconfig -p | grep libt дает

 libt.so.0 (libc6,x86-64) => /usr/local/lib/libt.so.0
libt.so (libc6,x86-64) => /usr/local/lib/libt.so
 

Так что, насколько я могу судить, до этого момента все выглядит нормально. Однако компиляция программы, которая должна использовать мою библиотеку, завершается неудачей:

 > gcc -o prog main.c -llibt
/usr/bin/ld: cannot find -llibt
 

libt.h

 #ifndef libt_h__
#define libt_h__

extern int add(int, int);

#endif 
 

libt.c

 int
add(int a, int b)
{
    return a   b;
}
 

главная страница.c

 #include <stdio.h>
#include <stdlib.h>
#include "libt.h"

void
print_usage()
{
    printf("usage: ./prog <number a> <number b>n");
}

int
main(int argc, char *argv[])
{
    int a = 0, b = 0, c = 0;

    if (argc != 3) {
        print_usage();
        return 1;
    }

    a = atoi(argv[1]);
    b = atoi(argv[2]);
    c = add(a, b);

    printf("%dn", c);

    return 0;
}
 

Ответ №1:

Понял это. Хотя имена библиотек должны иметь префикс «lib», этот префикс не должен указываться при связывании. То gcc -o prog main.c -llibt есть ошибается, пока gcc -o prog main.c -lt работает так, как ожидалось.