LINUX.ORG.RU

Как установить нестандартную библиотеку.


0

2

Использую компилятор arm-linux-gnueabi-gcc для написания своих программ (пишу под arm). Потребовалось воспользоваться функциями библиотеки libcurl. Как подключить эту библиотеку к своему компилятору, чтобы строка

#include <curl/curl.h>
не выдавала ошибку.

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

m0rph ★★★★★
()
Ответ на: комментарий от podovalov5

Это репозиторий исходных текстов, а я говорил о репозитории собранных пакетов твоего дистрибутива. Безусловно можно собрать curl для arm самому, но если ты раньше подобным не занимался, думаю тебе будет сложно это сделать.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Этот компилятор (arm-linux-gnueabi-gcc) я использовал, когда собирал ядро для своей железки. Но там всего пару команд. Конечно я новичок. С чего начать? Я думал, подключу хедер-файл и все заработает. Не угадал.

podovalov5
() автор топика

#include <curl/curl.h>

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

#include "/full/path/to/headers.h"
#include "../../path/to/headers.h"

Можно прописать путь в переменную PATH

export PATH=$PATH:path/to/headers/dir/

#include <curl/curl.h>

либо, установить бинарники в стандартные пути, такие, как /usr/include/

energyclab
()

#include <curl/curl.h>

это заголовочный файл, опрабатывается препроцессором, компилятору gcc передают ключик -I, если заголовочный файл в нестандартном месте.

curl для arm можно стащить у дебиан: https://packages.debian.org/search?keywords=curl

anonymous
()
Ответ на: комментарий от anonymous

Да, заклинило... Действительно -I для хедеров и -L для либ... пора в отпуск

energyclab
()

Если готовой либы подходящей для твоей системы не найдешь (а ее еще и на target device закинуть нужно или статически линковать) то гугли «cross-compiling curl»

P.S.

$ lsb_release -d
Description:	Ubuntu 12.10
$ ldd /usr/lib/x86_64-linux-gnu/libcurl.so.4.2.0
	linux-vdso.so.1 =>  (0x00007fff9f7ff000)
	libidn.so.11 => /usr/lib/x86_64-linux-gnu/libidn.so.11 (0x00007f8a1de5a000)
	liblber-2.4.so.2 => /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2 (0x00007f8a1dc4c000)
	libldap_r-2.4.so.2 => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so.2 (0x00007f8a1d9fc000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8a1d7f4000)
	libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f8a1d5b6000)
	libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f8a1d358000)
	libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f8a1cf7d000)
	librtmp.so.0 => /usr/lib/x86_64-linux-gnu/librtmp.so.0 (0x00007f8a1cd63000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8a1cb4b000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8a1c78b000)
	libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f8a1c56f000)
	libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f8a1c353000)
	libgssapi.so.3 => /usr/lib/x86_64-linux-gnu/libgssapi.so.3 (0x00007f8a1c116000)
	libgnutls.so.26 => /usr/lib/x86_64-linux-gnu/libgnutls.so.26 (0x00007f8a1be5a000)
	libgcrypt.so.11 => /lib/x86_64-linux-gnu/libgcrypt.so.11 (0x00007f8a1bbdb000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8a1b9be000)
	libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f8a1b6f0000)
	libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f8a1b4c6000)
	libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f8a1b2c2000)
	libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f8a1b0ba000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8a1aeb5000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8a1e318000)
	libheimntlm.so.0 => /usr/lib/x86_64-linux-gnu/libheimntlm.so.0 (0x00007f8a1acae000)
	libkrb5.so.26 => /usr/lib/x86_64-linux-gnu/libkrb5.so.26 (0x00007f8a1aa2c000)
	libasn1.so.8 => /usr/lib/x86_64-linux-gnu/libasn1.so.8 (0x00007f8a1a795000)
	libhcrypto.so.4 => /usr/lib/x86_64-linux-gnu/libhcrypto.so.4 (0x00007f8a1a562000)
	libroken.so.18 => /usr/lib/x86_64-linux-gnu/libroken.so.18 (0x00007f8a1a34d000)
	libtasn1.so.3 => /usr/lib/x86_64-linux-gnu/libtasn1.so.3 (0x00007f8a1a13b000)
	libp11-kit.so.0 => /usr/lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f8a19f27000)
	libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f8a19d23000)
	libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f8a19b1e000)
	libwind.so.0 => /usr/lib/x86_64-linux-gnu/libwind.so.0 (0x00007f8a198f5000)
	libheimbase.so.1 => /usr/lib/x86_64-linux-gnu/libheimbase.so.1 (0x00007f8a196e6000)
	libhx509.so.5 => /usr/lib/x86_64-linux-gnu/libhx509.so.5 (0x00007f8a1949e000)
	libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007f8a191f4000)
	libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f8a18fba000)

alx777 ★★
()

нужно указать gcc директорию с хедерами через -I подключаемую либу через -l и путь, где лежит либа в rootfs твоего таргета через -L

arm-linux-gnueabi-gcc -I/usr/include -lcurl -L$(ROOTFS_DIR)/usr/lib

zudwa
()
Ответ на: комментарий от Dark_SavanT

Относительно buildroot ничего не скажу, не юзал, а вот openembedded если таргет искаробки не поддерживается то с нуля нужно рассчитывать как минимум недели на 2 увлекательного процесса изучения/конфигурирования/тестирования (при условии что u-boot и ядро уже приведены в рабочее состояние) на что не у всех есть время и желание и что имеет смысл только в случае долгоиграющего проекта

alx777 ★★
()
Ответ на: комментарий от zudwa

zudwa последовал твоему совету, но получил вот такой вывод:

arm-none-linux-gnueabi-gcc -L/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib -lcurl -o programm_curl programm_curl.c 
/home/user/1/som_sdk/psp/buildroot-2013.05/output/host/opt/ext-toolchain/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.3/../../../../arm-none-linux-gnueabi/bin/ld: warning: libssl.so.1.0.0, needed by /home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so, not found (try using -rpath or -rpath-link)
/home/user/1/som_sdk/psp/buildroot-2013.05/output/host/opt/ext-toolchain/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.3/../../../../arm-none-linux-gnueabi/bin/ld: warning: libcrypto.so.1.0.0, needed by /home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so, not found (try using -rpath or -rpath-link)
/home/user/1/som_sdk/psp/buildroot-2013.05/output/host/opt/ext-toolchain/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.3/../../../../arm-none-linux-gnueabi/bin/ld: warning: libz.so.1, needed by /home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so, not found (try using -rpath or -rpath-link)
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `EVP_PKEY_copy_parameters'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `X509_LOOKUP_file'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `ASN1_STRING_length'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `SSL_get_error'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `PEM_read_X509'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `RAND_status'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `PKCS12_free'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `ENGINE_free'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `CRYPTO_free'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `sk_pop_free'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `RAND_load_file'
/home/user/1/som_sdk/psp/buildroot-2013.05/output/target/usr/lib/libcurl.so: undefined reference to `SSL_write'
Помогите осмыслить.

podovalov5
() автор топика
Ответ на: комментарий от energyclab

CXX_INCLUDE_PATH — для крестов. Сам в свое время намучился со сборкой из нестандартных каталогов :)

buddhist ★★★★★
()
Ответ на: комментарий от alx777

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

Dark_SavanT ★★★★★
()
Ответ на: комментарий от podovalov5

/home/user/1/som_sdk/psp/buildroot-2013.05/

блин, родный, сделай make menuconfig и выбери этот злосчастный curl, тебе билдрут его соберёт.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

сделай make menuconfig и выбери этот злосчастный curl, тебе билдрут его соберёт

Да сделал я это давно. Вывод при компиляции привел.

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

У меня вопрос-то теперь, как указать компилятору где заголовочные, где библиотека собранная, как сделать так, чтобы не было сообщения при компиляции, например:

 arm-none-linux-gnueabi-gcc -L/home/user/1/som_sdk/psp/buildroot-2013.05/output/host/usr/arm-buildroot-linux-gnueabi/sysroot/usr/lib -o programm_curl programm_curl.c 
/tmp/ccqXdcnq.o: In function `post_send':
programm_curl.c:(.text+0x884): undefined reference to `curl_global_init'
programm_curl.c:(.text+0x888): undefined reference to `curl_easy_init'
collect2: ld returned 1 exit status

podovalov5
() автор топика
Ответ на: комментарий от energyclab

После всех переборов получилось так (про -Ipath/to/headers/dir не пишу, я в коде абсолютный путь указал):

arm-none-linux-gnueabi-gcc -Lpath/to/lib -lcurl -Wl,-rpath,path/to/lib -o programm_curl programm_curl.c
Кто-нибудь может объяснить для чего нужна эта часть: -Wl,-rpath,path/to/lib?

podovalov5
() автор топика
Ответ на: комментарий от podovalov5

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

energyclab
()
Ответ на: комментарий от podovalov5

нужно еще добавить -lssl -lcrypto и путь, если openssl не в ${ROOTFS}/usr/lib

zudwa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.