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

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

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

C++ Подключение к проекту jpg
C++ подключение dll к проекту из внешней директории
C++ Подключение wininet.h к проекту
C++ Подключение dll (C++) к проекту VB 6.0
Подключение dll к проекту в visual studio C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 11:21     Подключение С библиотеки (.so) к проекту С++ #2
Например вот-так: LIBS += -L<путь к библиотеке> -l<имя файла библиотеки>
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 19:08  [ТС]     Подключение С библиотеки (.so) к проекту С++ #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++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 19:12     Подключение С библиотеки (.so) к проекту С++ #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  [ТС]     Подключение С библиотеки (.so) к проекту С++ #5
Эмм... Я, может, чего-то не понимаю, но где здесь файлы С++?
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 19:39     Подключение С библиотеки (.so) к проекту С++ #6
Аналогично вместо *.c - файлов используйте файлы *.cpp и уберите -std=c99
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 19:50  [ТС]     Подключение С библиотеки (.so) к проекту С++ #7
Так, как вы указали, пыталась делать изначально, но проблема была в том, что С функции so библиотеки не были видны функциям С++. Соответственно мне такой метод не помог. Простыми -L и -l такое не решалось.
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 19:52     Подключение С библиотеки (.so) к проекту С++ #8
А причем тут *.c-файлы, создаете библиотеку test.cpp, компилируете на языке с++, потом основную программу main.cpp тоже на языке с++, тогда все функции библиотеки libtest.so видны основной программе main.cpp
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 20:10  [ТС]     Подключение С библиотеки (.so) к проекту С++ #9
Пардон, но я всего второй день общаюсь с gcc без посредников)
То есть вы имеете в виду создать с++ либу, связать ее символической ссылкой с си либой? И оно должно работать? Оо
И еще вопрос: что тогда прописывать в созданной библиотеке? Функции сишной библиотеки?
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 20:16     Подключение С библиотеки (.so) к проекту С++ #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++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 20:41     Подключение С библиотеки (.so) к проекту С++ #11
Вот файл проекта:
Вложения
Тип файла: 7z test.7z (579 байт, 5 просмотров)
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 21:28  [ТС]     Подключение С библиотеки (.so) к проекту С++ #12
Хочу!) Потому что я явно что-то недогоняю, как ни пытаюсь это сделать) Но личка у меня пока закрыта, двух дней со дня регистрации на форуме еще не прошло)

Добавлено через 46 минут
Если я правильно поняла, то вы создаете юиюлиотеку, а у меня она уже есть, как и с++ файлы... Что-то у меня совсем каша в голове)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16829 / 5250 / 321
Регистрация: 30.03.2009
Сообщений: 14,139
Записей в блоге: 26
08.08.2013, 21:40     Подключение С библиотеки (.so) к проекту С++ #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  [ТС]     Подключение С библиотеки (.so) к проекту С++ #14
Ах вон оно что... Ну да, это как-то странно. Про экстерны я изначально в курсе была, так долго тупила, потому что не знала, куда их писать, И да, библиотека у меня не в виде исходников...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16829 / 5250 / 321
Регистрация: 30.03.2009
Сообщений: 14,139
Записей в блоге: 26
09.08.2013, 11:43     Подключение С библиотеки (.so) к проекту С++ #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"
}
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
09.08.2013, 18:38  [ТС]     Подключение С библиотеки (.so) к проекту С++ #16
Так бы и сделала, если б знала, что там за ашники) Библиотека была уже собранная, просмотреть ее внутренности я так и не смогла, и гугл не подсказал(
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16829 / 5250 / 321
Регистрация: 30.03.2009
Сообщений: 14,139
Записей в блоге: 26
09.08.2013, 19:12     Подключение С библиотеки (.so) к проекту С++ #17
Не зная прототипов функций, как же ты их тогда собираешься вызывать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 21:22     Подключение С библиотеки (.so) к проекту С++
Еще ссылки по теме:

C++ Подключение dll на C# к проекту на С++ и вызов функции из неё
Подключение SDL.h к проекту C++
C++ Подключение dll к проекту в среде Dev C++

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

Или воспользуйтесь поиском по форуму:
unspoken
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
09.08.2013, 21:22  [ТС]     Подключение С библиотеки (.so) к проекту С++ #18
Вот и я так подумала сначала) Потом начальник (фиг знает откуда!) вытащил прототипы и тогда задача стала проста, как день)
Yandex
Объявления
09.08.2013, 21:22     Подключение С библиотеки (.so) к проекту С++
Ответ Создать тему
Опции темы

Текущее время: 18:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru