Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
#1

Подключение С библиотеки (.so) к проекту С++ - C++

08.08.2013, 10:57. Просмотров 2266. Ответов 17
Метки нет (Все метки)

С++ не хочет подключать сишную библиотеку, пробовала подключить и методами gcc из консоли, и методами QT, создавала makefile, все едино. Писать при каждом вызове библиотечной функции extern "C" тоже не вариант, слишком много вызовов этих самых функций в разных файлах, копаться неделю можно. Может, есть какие-то более простые методы решения проблемы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2013, 10:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подключение С библиотеки (.so) к проекту С++ (C++):

Подключение к проекту jpg - C++
Всем доброго времени! Может кто знает как вставить, подключить файл jpg к проекту чтоб он открывался при запуске вместе? Если можно,...

Подключение wininet.h к проекту - C++
Добрый день, в рамках самообразования мне захотелось изучить С++. Поставил Visual Studio Express 2012, в течении дня в промежутках между...

Подключение dll (C++) к проекту VB 6.0 - C++
Здравствуйте! Проблемма в подключении ДЛЛ к VB 6. есть библиотека на C++ //ConsoleApplication2.cpp: определяет точку входа для...

Подключение SDL.h к проекту - C++
Доброго времени суток, уважаемые форумчане. Я пытаюсь скомпилировать готовый проект вот отсюда:...

Подключение к проекту С++ dll, lib файлов - C++
Всем привет. Возникла необходимость подключения библиотек POCO - Download; POCO - POCO Zip Library; В частичности интересует...

Подключение dll к проекту в среде Dev C++ - C++
Добрый день, Первый день с Dev c++ Мне нужно к проекту подключить dll библиотеку. Как это правильно сделать? Мной сделано следующее:...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zitxbit
Master C/C++
88 / 740 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 11:21 #2
Например вот-так: LIBS += -L<путь к библиотеке> -l<имя файла библиотеки>
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 19:08  [ТС] #3
Так пробовала и неоднократно, ругается, пишет, что не видит функций библиотеки.

Добавлено через 14 минут
Попробовала так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
LIBS += extern \
    "C" \
    {-L"/root/Zevs/Akulov/" \
    -l"lf"} \
    extern \
    "C" \
    {-L"/root/Zevs/Akulov/" \
    -l"elf"} \
    extern \
    "C" \
    {-L"/root/Zevs/Akulov/" \
    -l"vlf"}
OTHER_FILES += libvlf.so \
    liblf.so \
    libelf.so
все равно не видит функций((

Добавлено через 7 часов 28 минут
Проблема решена!
Создала ашник, в который написала примерно следующее:
C++ (Qt)
1
2
3
4
5
6
extern "C" 
{
    void LibFunction1();
    void LibFunction2();
    //etc
}
и затем этот ашник подключила к нужным файлам, которые ругались, что не знают библиотечных функций. Из прошника extern "C" поубирать.
zitxbit
Master C/C++
88 / 740 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 19:12 #4
1) Создаем библиотеку test:

Bash
1
nano test.h
C++
1
2
/* test.h */
void myfunc(void);
Bash
1
nano test.c
C++
1
2
3
4
5
6
7
8
/* test.c */
#include <stdio.h>
#include "test.h"
 
void myfunc(void)
{
     printf("Myfunc...\n");
}
2) Компилируем библиотеку test:
Bash
1
2
gcc -std=c99 -Wall -fPIC -c test.c
gcc -std=c99 -shared -o libtest.so.1.0.0.0 -Wl,-soname,libtest.so.1 test.o
3) Создаем две ссылки типа symlinks на файл libtest.so.1.0.0.0:
Bash
1
2
ln -s libtest.so.1.0.0.0 libtest.so
ln -s libtest.so.1.0.0.0 libtest.so.1
4) Создаем файл main.c:
Bash
1
nano main.c
C++
1
2
3
4
5
6
7
8
9
/* main.c */
#include <stdio.h>
#include "test.h"
 
int main(int argc, char* argv[])
{
     printf("Main...\n");
     myfunc(); 
}
5) Компилируем файл main.c:
Bash
1
2
gcc -std=c99 -Wall -fPIC -c main.c
gcc -o main main.o -L. -ltest -Wl,-rpath,.
6) Запускаем файл main:
Bash
1
./main
$./main
Main...
MyFunc...

Вот-так!
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 19:38  [ТС] #5
Эмм... Я, может, чего-то не понимаю, но где здесь файлы С++?
zitxbit
Master C/C++
88 / 740 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 19:39 #6
Аналогично вместо *.c - файлов используйте файлы *.cpp и уберите -std=c99
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 19:50  [ТС] #7
Так, как вы указали, пыталась делать изначально, но проблема была в том, что С функции so библиотеки не были видны функциям С++. Соответственно мне такой метод не помог. Простыми -L и -l такое не решалось.
zitxbit
Master C/C++
88 / 740 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 19:52 #8
А причем тут *.c-файлы, создаете библиотеку test.cpp, компилируете на языке с++, потом основную программу main.cpp тоже на языке с++, тогда все функции библиотеки libtest.so видны основной программе main.cpp
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 20:10  [ТС] #9
Пардон, но я всего второй день общаюсь с gcc без посредников)
То есть вы имеете в виду создать с++ либу, связать ее символической ссылкой с си либой? И оно должно работать? Оо
И еще вопрос: что тогда прописывать в созданной библиотеке? Функции сишной библиотеки?
zitxbit
Master C/C++
88 / 740 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 20:16 #10
НЕТ! Все что вам необходимо сделать это:

1) Переименовать файлы test.c, main.c вот так:
Bash
1
2
mv test.c test.cpp 
mv main.c main.cpp
2) Далее:

Bash
1
2
gcc -Wall -fPIC -c test.cpp
gcc -shared -o libtest.so.1.0.0.0 -Wl,-soname,libtest.so.1 test.o
3) Создаем две ссылки типа symlinks на файл libtest.so.1.0.0.0:
Bash
1
2
ln -s libtest.so.1.0.0.0 libtest.so
ln -s libtest.so.1.0.0.0 libtest.so.1
4) Компилируем файл main.c:
Bash
1
2
gcc -Wall -fPIC -c main.cpp
gcc -o main main.o -L. -ltest -Wl,-rpath,.
P.S. Если хотите, оставайтесь на форуме я пришлю вам готовый "проект" со скриптами компиляции.
В любом случае, пишите в "личку".
zitxbit
Master C/C++
88 / 740 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 20:41 #11
Вот файл проекта:
Вложения
Тип файла: 7z test.7z (579 байт, 5 просмотров)
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 21:28  [ТС] #12
Хочу!) Потому что я явно что-то недогоняю, как ни пытаюсь это сделать) Но личка у меня пока закрыта, двух дней со дня регистрации на форуме еще не прошло)

Добавлено через 46 минут
Если я правильно поняла, то вы создаете юиюлиотеку, а у меня она уже есть, как и с++ файлы... Что-то у меня совсем каша в голове)
Evg
Эксперт CАвтор FAQ
17640 / 5864 / 379
Регистрация: 30.03.2009
Сообщений: 16,167
Записей в блоге: 26
08.08.2013, 21:40 #13
Проблема объединения текстов на Си и Си++ заключается в том, что из-под C++ все имена функций оказываются испорченными. От опций -L, -l и т.п. это никак не зависит. Нужно просто правильно обращаться из функций Си++ к функциям и переменным Си. В обратную сторону законными средствами обращение невозможно. Если сишная библиотека у тебя в виде бинарника, то единственный способ нормально её подключить - обращаться ко всем сишным функциям/переменным через extern "C". Если у тебя сишная библиотека в виде исходников, то её можно перекомпилировать компилятором Си++, как это тебе упорно пытается впарить zitxbit, хотя я бы не рекомендовал этим заниматься, т.к. один и тот же исходник может работать по разному, будучи скомпилированный в режиме си и си++

Ссылка по теме Использование C++ кода внутри программы на C: какие есть варианты?

Добавлено через 1 минуту
Вот тут пример того, как посмотреть испорченные (манглированные) имена: http://www.cyberforum.ru/cpp-experts...ml#post1973727
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 23:14  [ТС] #14
Ах вон оно что... Ну да, это как-то странно. Про экстерны я изначально в курсе была, так долго тупила, потому что не знала, куда их писать, И да, библиотека у меня не в виде исходников...
Evg
Эксперт CАвтор FAQ
17640 / 5864 / 379
Регистрация: 30.03.2009
Сообщений: 16,167
Записей в блоге: 26
09.08.2013, 11:43 #15
Цитата Сообщение от unspoken Посмотреть сообщение
так долго тупила, потому что не знала, куда их писать
Сишная библиотека поставляет свои include-файлы. Допустим, файлы называются "c-header1.h", "c-header-2.h", ... Теперь в исходниках Си++ их надо подключать, обернув их extern'ом:

C++
extern "C"
{
#include "c-header1.h"
}
...
extern "C"
{
#include "c-header2.h"
}
Если они все подключаются рядом, то можно всё объединить

C++
extern "C"
{
#include "c-header1.h"
#include "c-header2.h"
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 11:43
Привет! Вот еще темы с ответами:

Подключение dll к проекту в visual studio - C++
Доброго дня, тема уже эта конечно избитая на форуме, но так и не смог найти решения под свою конкретную задачу, прочитав все, что...

Подключение MYSQL к проекту Visual Studio C++ - C++
Здравствуйте, как подключить базу данных MYSQL, phpMyAdmin к проекту (CLR/Windows Forms C++)?

Подключение dll к проекту на Visual Studio - C++
Привет. Я в этом деле новичок еще не приходилось собирать с нуля проекты с .dll в visual studio 2012 поэтому смутно понимаю с чего нужно...

Подключение dll к проекту из внешней директории - C++
Всем привет. Компилятор: mingw IDE: обычный блокнот + консоль Ситуация: Я создаю несколько мини программ (~200 строк...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.08.2013, 11:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru