2013-02-09 3 views
3

Я пытаюсь написать простую проверку синтаксиса для кода C, используя интерфейс, доступный в libclang. Из-за проблем с развертыванием мне нужно иметь возможность статически связывать все библиотеки в libclang, а не передавать файл .so со всеми библиотеками.Статическое связывание libclang в коде C

Я строю clang/llvm из источника, а в llvm/Release + Asserts/lib У меня есть куча файлов .a, которые, я думаю, я должен использовать, но он никогда не работает (компоновщик извергает тысячи ошибок о недостающих символах). Однако, когда я скомпилировать его с помощью libclang.so также присутствует в этом каталоге следующим образом:

clang main.c -o bin/dlc -I../llvm/tools/clang/include -L../llvm/Release+Asserts/lib/ -lclang 

Все, кажется, работает хорошо.

Каков минимальный набор файлов .a, которые мне нужно включить, чтобы сделать эту работу? Я попытался включить абсолютно все файлы .a в каталог вывода сборки, причем они были предоставлены clang/gcc в разных заказах без каких-либо успехов. Мне нужны только функции, упомянутые в index.h libclang, но, похоже, нет никаких ресурсов или документации о том, для чего предназначены различные файлы libclang * .a. Было бы очень полезно узнать, какие файлы libclang.so втягивает.

+0

Что делать, если вы добавляете '-статический' в флаги компоновщика? – 2013-02-09 08:13:06

+0

Я попытался НКУ -static -lstatic1 -lstatic2 -Wl, -ldynamic1 -ldyanamic2 , как показано в [ссылка] (http://stackoverflow.com/questions/4156055/gcc-static-linking-only- некоторые библиотеки) , чтобы не статически ссылаться на все libc (что я могу связать динамически). Однако, похоже, это вообще не помогает, поскольку мне все еще нужно знать, какие файлы .a необходимы. – kfc9001

+0

О, я вижу. На какие символы ссылается линкер? – 2013-02-09 08:17:11

ответ

0

Предполагается, что работа будет работать, поскольку весь проект имеет все статические библиотеки (я подсчитал 116 в каталоге Release/lib).

лязг main.c -o бен/-I ../ DLC LLVM/инструменты/лязг/включают ../llvm/Release/lib/*.a

[править: лязг main.c -o bin/dlc -I ../ llvm/tools/clang/include ../llvm/Release/lib/libclang.a ../llvm/Release/lib/*.a]

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

Если это не сработает, возможно, вам потребуется указать список библиотек: если в какой-либо библиотеке требуется функция, доступная в другой библиотеке, может потребоваться ее сначала перечислить в командной строке. См. Комментарии к порядку размещения ссылок по адресу: http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Link-Options.html#Link-Options

+0

Я пробовал это, но у меня все еще возникают ошибки. Я вставил [output] (https://gist.github.com/anonymous/4950728) из компоновщика, на случай, если мне не хватает чего-то глупого. Использование gcc или clang похоже на ту же проблему. Это на Fedora 17. Я попробую угадать в порядке ссылки. – kfc9001

+0

undefined ссылка на 'std :: string :: _ Rep :: _ S_empty_rep_storage '. Отсутствует функция stdlib. Запустите clang ++ вместо clang. – hdante

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