Не могу скомпилировать и связать с динамической библиотекой - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь скомпилировать простой привет мир, определив функцию в общей библиотеке, но при компиляции основной программы я получаю:

/tmp/hello-ca67ea.o: In the function 'main':
hello.c:(.text+0x1a): reference to 'greeting(char const*)' not defined
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я пробовал оба с Clang и GCC и возникает та же ошибка.

Я уже искал SO, но ничего подобного не нашел.

Каталог следует:

shared-test
 |
 |--greeting.c
 |--greeting.h
 |--hello.c

hello.c

#include "greeting.h"

int main ()
{
    greeting("Daniel");
    return 0;
}

reeting.h

#ifndef GREETING_H
#define GREETING_H

void greeting(const char* text);

#endif

reeting.c

#include <stdio.h>
#include "greeting.h"

void greeting(const char* text)
{
    printf("%s\n", text);
}

reeting.so компилируется с clang greeting.c -o greeting.so -shared -fPIC

И я пытаюсь скомпилировать привет с clang hello.c -o hello -Igreeting

Может кто-нибудь помочь мне понять, что я делаю не так?

1 Ответ

0 голосов
/ 07 декабря 2018

clang hello.c -o hello -Igreeting

пытается скомпилировать и связать , но вы не указали имя библиотеки для ссылки:

clang hello.c -o hello -Igreeting greeting.so #<= greeting.so added

Затем выдолжен быть в состоянии запустить вывод с:

LD_LIBRARY_PATH=. ./hello 

Идея состоит в том, что библиотека будет помещена в один из путей вашей системной библиотеки, а поскольку вы этого не сделали, переменная среды LD_LIBRARY_PATH является своего родавзлома, чтобы заставить его работать без него.

С помощью gcc / clang в Linux вы также можете жестко закодировать полный путь:

clang hello.c -o hello -Igreeting $PWD/greeting.so

или вы можете выполнить динамический компоновщик для поисказависимость относительно расположения исполняемого файла

clang hello.c -o hello -Igreeting '-Wl,-rpath=$ORIGIN' greeting.so

С помощью любого из двух указанных выше методов вам больше не нужна часть LD_LIBRARY_PATH=..

В динамических библиотеках гораздо большеи я рекомендую вам изучить их подробнее, например, из DSO Howto рецензии Ульриха Дреппера.

...