LINUX.ORG.RU

Linux C++ Как обернуть свои классы, использующие стороние библиотеки, в библиотеку?


0

2

Добрый день! У меня есть следующее:

A.h
#include <curl/curl.h>
class A
{
public:
  void Method();
};
A.cpp
#include "A.h"
void A::Method() {}
Мне нужно обернуть этот класс(набор классов), использующий библиотеку curl в библиотеку. (Статическую и динамическую), чтобы клиент мог использовать метод Method. То есть уметь выполнить у себя нечто типа (при этом curl на клиенте не установлен):
#include "A.h"
A a;
a.Method()
Не подскажете, как правильно собрать статическую и динамическую биюлиотеку в моем случае и скомпилировать клиентский код библиотекой для проверки?



Последнее исправление: Masha (всего исправлений: 1)

Советую сразу приступить к изучению cmake. Там это делается просто и непринужденно. Можно, кстати, собрать динамическую библиотеку, в которую будут статически влинкованы все зависимости (вдруг пригодится). Читаем документацию по cmake + пользуемся гуголом.

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

Спасибо!Извините,если глупый вопрос,если cmake не стоит у клиента, могут быть проблемы при запуске моей библиотеки?

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

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

Human-source
()
Ответ на: комментарий от Masha

если cmake не стоит у клиента, могут быть проблемы при запуске моей библиотеки?

cmake - система сборки приложений, соответственно, она нужна тебе для сборки программы

Masha
Дата регистрации: 12.07.2010 12:53:04

Что-то с этим миром не так, на ЛОРе всё больше и больше женского пола.

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

Что-то с этим миром не так, на ЛОРе всё больше и больше женского пола.

И их количество растёт всё быстрее! Эффект сарафанного радио.

Human-source
()
Ответ на: комментарий от Anon

.

Простите,если можно пример без cmake. Отдельный Makefile файл для сборки билиотеки и клиентского кода. Статическую библиотеку я собрала, но не уверена,что там где не установлен curl она заработает. Клиентский код также не удается правильно скомпилировать:(

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

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

Masha
() автор топика
Ответ на: . от Masha

Отдельный Makefile файл для сборки билиотеки и клиентского кода

Только ССЗБ вручную пишет Makefile!

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

Нахер cmake. Сказано же «правильно собрать статическую и динамическую биюлиотеку»

autotools во все поля.

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

У меня есть рекомендумая машина для сборки, там стоит версия cmake 2.6 могут ли быть какие-то ограничения или проблемы в связи с этим?

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

++

Masha

Все же была бы очень благодарна за пример без cmake для начала.

Мой велосипед, обрати внимание на строчку

add_library(${AUTHLIB} SHARED ${LIBSRCS} ${PO_FILE} ${MO_FILE})
она разделяемую библиотечку и делает.

Ну, а дальше — сама читай. Я тебе проксей работать не буду.

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

Спасибо большое! Вот пробую с cmake.

project(project)

set(SOURCE_EXE main.cpp)

set(SOURCE_LIB StringUtil.cpp CurlSoapHandler.cpp)

add_library(foo STATIC ${SOURCE_LIB})

add_executable(test_s ${SOURCE_EXE})

target_link_libraries(test_s foo)

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

Собираю статическую библиотеку foo из исходников. Она собирается, но при сборке компилятор ругается на все мои функции из библиотеки curl. Как мне подцепить библиотеку curl в мою библиотеку?Важно,чтобы у клиента все собиралось,с моей библиотекой на машине,где curl не установлен.

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

А пример для моей реализации?У меня клиент использует мою библиотеку,он ничего не знает про curl, мне нужно,чтобы она была внутри libfoo.a, но у меня ее внутри нет сейчас и как это сделать я не понимаю.

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

Как собрать с помощью cmake библиотеку(статическую и динамическую),внутри которой будет другая библиотека,причем как бы статически внутри...(чтобы у клиента не возникало проблем при запуске моей библиотеки).Вообще это вроде стандартная задача. Написание библиотеки,которая,в свою очереь, использует сторонние бибилиотеки?Может,кто-то с этим сталкивался,как это делается?На клиенте ставятся какие-то библиотеки?

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

Вот ты для своей библиотечки и пишешь, что нужна curl. Потом компиляешь ее. Клиенту отдаешь уже бинарник.

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

Почему Вы считаете,что это будет статическая линковка?То есть библиотека запуститься там,где curl не установлен?

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

для моего примера не очень понятно,как это сделать.

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

Семь лет без компа? Автотулзы уже никто не использует в здравом уме, слово «ламер» тоже уже забыто.

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

Создала библиотеку, не знаю правильно или неправильно:

project(hello_world)

set(SOURCE_LIB StringUtil.cpp CurlSoapHandler.cpp)

add_library(foo STATIC ${SOURCE_LIB})

target_link_libraries(foo -lcurl)

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

Никакой. Опция add_executable — для сборки бинарника. На этапе сборки библиотеки она не нужна. Для библиотеки нужно будет два пунктика add_library: один со STATIC, другой — с SHARED. Плюс еще кое-какое колдовство понадобится, чтобы туда статически влинковать curl (внимательно читай сstackexchange).

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

Теперь хочу ее использовать

project(hello_world)

set(SOURCE_EXE main.cpp) 

add_library(foo STATIC IMPORTED)

set_property(TARGET foo PROPERTY
             IMPORTED_LOCATION /usr/local/CMakeExample/Example2/foo.a)

add_executable(test ${SOURCE_EXE}) 

target_link_libraries(${TARGET} foo)

target_link_libraries(test foo)

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

А вообще, это же извращение: линковать curl куда-то статически! Ну покажи мне машину, где нет libcurl! Это что — МСВС начала этого тысячелетия?

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

Не могли бы Вы поправить мои файлы для корректного использования и сбора библиотеки?

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

Маша, ты уверена, что это разглашать можно?

А то, судя по твоим темам, ты — студентка какого-то технарского ВУЗа и тебя заставили для суровых военных пилить какой-то протокол связи, не поинтересовавшись (а это у вояк само собой), соображаешь ли ты вообще в программировании!

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

Какой архив?Здесь просто представлено,как я собираю сначала библиотеку, а затем приложение,которое использует. Вопрос,если ошибки в этих файлах?

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

Клиент подключает h-файл (который у меня внутри библлиотеки) и использует методы объекта

#include "A.h"
A a;
a.Method()
Masha
() автор топика
Ответ на: комментарий от Masha

то есть у меня так, как я делаю, h-файл A.h не находится и make не проходит.

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

Собираю библиотеку из исходников.Вот так все работает.

project(hello_world)

set(SOURCE_EXE main.cpp) 

set(SOURCE_LIB  StringUtil.cpp CurlSoapHandler.cpp) 
add_library(foo STATIC ${SOURCE_LIB})
target_link_libraries(foo -lcurl)

add_executable(test ${SOURCE_EXE})

target_link_libraries(test foo)

А я хочу собирать еще по-другому. То есть как клиент,у которого нет исходников, а есть только собранный мной(вот так как здесь пусть) файл libfoo.a

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