41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
1

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

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

Author24 — интернет-сервис помощи студентам
С++ не хочет подключать сишную библиотеку, пробовала подключить и методами gcc из консоли, и методами QT, создавала makefile, все едино. Писать при каждом вызове библиотечной функции extern "C" тоже не вариант, слишком много вызовов этих самых функций в разных файлах, копаться неделю можно. Может, есть какие-то более простые методы решения проблемы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2013, 10:57
Ответы с готовыми решениями:

Подключение библиотеки к Qt проекту
В *.pro файле подключаю библиотеку таким образом: INCLUDEPATH += . с:/source/library/include...

Подключение С/С++ библиотеки к проекту на C#
Помогите новичку подключить С/С++ библиотеку к проекту на C# Проблема: - есть DLL написанная на...

Подключение библиотеки dll (c++) к проекту на c#
Как подключить библиотеку dll написанную на c++ к проекту на c#? Добавлено через 5 минут Если...

Подключение к проекту своей библиотеки
Я хочу свои процедуры и функции подключать к проекту через #include <myfunc.h> Функции объявляю в...

17
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 11:21 2
Например вот-так: LIBS += -L<путь к библиотеке> -l<имя файла библиотеки>
1
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" поубирать.
0
96 / 748 / 279
Регистрация: 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...

Вот-так!
0
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 19:38  [ТС] 5
Эмм... Я, может, чего-то не понимаю, но где здесь файлы С++?
0
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 19:39 6
Аналогично вместо *.c - файлов используйте файлы *.cpp и уберите -std=c99
0
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 19:50  [ТС] 7
Так, как вы указали, пыталась делать изначально, но проблема была в том, что С функции so библиотеки не были видны функциям С++. Соответственно мне такой метод не помог. Простыми -L и -l такое не решалось.
0
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 19:52 8
А причем тут *.c-файлы, создаете библиотеку test.cpp, компилируете на языке с++, потом основную программу main.cpp тоже на языке с++, тогда все функции библиотеки libtest.so видны основной программе main.cpp
0
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 20:10  [ТС] 9
Пардон, но я всего второй день общаюсь с gcc без посредников)
То есть вы имеете в виду создать с++ либу, связать ее символической ссылкой с си либой? И оно должно работать? Оо
И еще вопрос: что тогда прописывать в созданной библиотеке? Функции сишной библиотеки?
0
96 / 748 / 279
Регистрация: 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. Если хотите, оставайтесь на форуме я пришлю вам готовый "проект" со скриптами компиляции.
В любом случае, пишите в "личку".
0
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
08.08.2013, 20:41 11
Вот файл проекта:
Вложения
Тип файла: 7z test.7z (579 байт, 25 просмотров)
0
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 21:28  [ТС] 12
Хочу!) Потому что я явно что-то недогоняю, как ни пытаюсь это сделать) Но личка у меня пока закрыта, двух дней со дня регистрации на форуме еще не прошло)

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

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

Добавлено через 1 минуту
Вот тут пример того, как посмотреть испорченные (манглированные) имена: https://www.cyberforum.ru/cpp-... ost1973727
1
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
08.08.2013, 23:14  [ТС] 14
Ах вон оно что... Ну да, это как-то странно. Про экстерны я изначально в курсе была, так долго тупила, потому что не знала, куда их писать, И да, библиотека у меня не в виде исходников...
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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"
}
0
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
09.08.2013, 18:38  [ТС] 16
Так бы и сделала, если б знала, что там за ашники) Библиотека была уже собранная, просмотреть ее внутренности я так и не смогла, и гугл не подсказал(
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.08.2013, 19:12 17
Не зная прототипов функций, как же ты их тогда собираешься вызывать?
0
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
09.08.2013, 21:22  [ТС] 18
Вот и я так подумала сначала) Потом начальник (фиг знает откуда!) вытащил прототипы и тогда задача стала проста, как день)
0
09.08.2013, 21:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2013, 21:22
Помогаю со студенческими работами здесь

Подключение динамической библиотеки C# к проекту Qt C++
Здравствуйте Пробую подключить библиотеку созданную VC код С# using System; using...

Подключение библиотеки ffmpeg к проекту
Здравствуйте. Я начал разбираться с библиотекой ffmpeg. Но не пойму как ее можно подключить к...

Подключение vb.net библиотеки к проекту на C#
Всем здравия. Начинаю изучать C# и одновременно переносить свой проект с одного языка на другой....

Подключение к проекту x64 библиотеки
Здравствуйте. Есть DLL 64 битная. То есть обычный implib его не возьмёт(на выходе получается файл...

Подключение библиотеки SFML к проекту
Ребята подскажите, возможно ли подключить библиотеку #include &lt;CFML\Graphics.hpp&gt;в Dev C++4.9.9.2,...

Подключение библиотеки (DLL) на Delphi к проекту на C#
Добрый день. Создал длл на Delphi XE2 library Lic; uses System.SysUtils, ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru