Почему компиляция stderr C содержит pwd разработчиков статической библиотеки, которую я использую? - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь использовать liboidc-agent (Github) Скомпилированная статическая библиотека.

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

Примечание: / home / gabriel / Dokumente / ... не мойкаталог.Но, скорее всего, каталог разработчика.Это не должно быть там, верно?Библиотеки должны быть повторно используемыми пакетами кода.

Как это исправить и сделать liboidc-agent пригодным для использования? Минимальный пример (Github) Просто запустите 'make'

Или я что-то упустил?Спасибо за помощь!

make
gcc -o main main.c -L. -I. -loidc-agent
./liboidc-agent.a(api.o): In function `oidc_serror':
/home/gabriel/Dokumente/git-repo/oidc-agent/src/oidc_error.h:95: undefined reference to `oidc_sprintf'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/oidc_error.h:97: undefined reference to `clearFreeString'
./liboidc-agent.a(api.o): In function `getAccountRequest':
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:12: undefined reference to `oidc_sprintf'
./liboidc-agent.a(api.o): In function `getAccessTokenRequest':
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:16: undefined reference to `isValid'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:19: undefined reference to `oidc_sprintf'
./liboidc-agent.a(api.o): In function `communicate':
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:27: undefined reference to `ipc_init'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:30: undefined reference to `ipc_connect'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:33: undefined reference to `ipc_vwrite'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:34: undefined reference to `ipc_read'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:35: undefined reference to `ipc_close'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:37: undefined reference to `printError'
./liboidc-agent.a(api.o): In function `getAccessToken':
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:58: undefined reference to `clearFreeString'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:66: undefined reference to `getJSONValues'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:67: undefined reference to `printError'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:68: undefined reference to `clearFreeString'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:71: undefined reference to `clearFreeString'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:75: undefined reference to `clearFreeString'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:76: undefined reference to `clearFreeString'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:77: undefined reference to `clearFreeString'
./liboidc-agent.a(api.o):/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:80: more undefined references to `clearFreeString' follow
./liboidc-agent.a(api.o): In function `getLoadedAccounts':
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:103: undefined reference to `getJSONValues'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:104: undefined reference to `printError'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:105: undefined reference to `clearFreeString'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:108: undefined reference to `clearFreeString'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:112: undefined reference to `clearFreeString'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:113: undefined reference to `clearFreeString'
/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:114: undefined reference to `clearFreeString'
./liboidc-agent.a(api.o):/home/gabriel/Dokumente/git-repo/oidc-agent/src/api.c:117: more undefined references to `clearFreeString' follow
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target 'main' failed
make: *** [main] Error 1

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018
Файл

A .a - это просто архив, содержащий несколько .o файлов, связанных вместе, с необязательным индексом символа.И файл .o ссылается на исходный файл, чтобы ошибка была более точной - в противном случае вы просто получите ошибку из api.o вместо фактического исходного файла, откуда она взята.


Настоящая проблема в том, что весь liboidc-agent.a - просто мусор.Если вы посмотрите на список файлов:

% ar t liboidc-agent.a 
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o
api.o

вместо нескольких разных объектных файлов, у него будет один и тот же файл всего в нескольких копиях.Поговорите с пользователем, чей это репозиторий, получите библиотеку из другого места или соберите ее из исходного кода.

0 голосов
/ 27 сентября 2018

Таким образом, библиотека - это просто набор скомпилированных объектных файлов.Разработчики этой библиотеки отправили ее с полными путями в свои рабочие каталоги, что позволяет использовать несколько объектных файлов с одним и тем же именем в одной и той же библиотеке.

И я заметил, что это файлы заголовков.GCC всегда включает полное имя пути для include, так что вы знаете, какой файл setup.h он выбрал, например.

Было бы намного лучше, если бы они упростили свой процесс выпуска, чтобы имя пути включало имя библиотекихотя бы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...