<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204289</guid>
        <pubDate>Fri, 04 Aug 2006 11:24:44 +0000</pubDate>
        <title>Класс в динамичиской библиотеке(so, dll)</title>
        <link>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204289</link>
        <description><![CDATA[Olimpik: :D Ура&#33;&#33;&#33;&#33;<br>
<br>
Всё зароботала&#33;&#33;&#33; благодарен&#33;&#33;&#33;<br>
<br>
Вот конечный результат, вдруг кому пригодиться:<br>
<br>
Весь пример в трёх файла:<br>
================================================<br>
 Библиотека |  исходники: dynlib.h, dynlib.cpp<br>
            |   результат: libdynlib.so<br>
<br>
 Тестовая прога | исходники: main.cpp<br>
                | результат: main<br>
<br>
 OS - Linux<br>
=================================================<br>
<br>
-------------------------------------------------------<br>
dynlib.h<br>
-------------------------------------------------------<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;#include &#60;qt.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">/* Абстрактный интерфейс */</div><div class="code_line">class &nbsp;Q_EXPORT &nbsp;MyClassInterface</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual ~MyClassInterface() {};</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual char* getTitle() = 0;</div><div class="code_line">};</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
-------------------------------------------------------<br>
dynlib.cpp<br>
-------------------------------------------------------<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;dynlib.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">class MyClass : public MyClassInterface {</div><div class="code_line">&nbsp;&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual char *getTitle() {return &quot;I&#39;m MyClass&quot;;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">Q_EXTERN_C Q_EXPORT MyClassInterface* getMyClass()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return new MyClass();</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
-------------------------------------------------------<br>
main.cpp<br>
-------------------------------------------------------<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;qapplication.h&#62;</div><div class="code_line">#include &#60;qdir.h&#62;</div><div class="code_line">#include &#60;qlabel.h&#62;</div><div class="code_line">#include &#60;qlibrary.h&#62;</div><div class="code_line">#include &#60;qstring.h&#62;</div><div class="code_line">#include &quot;dynlib.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">//----------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">int main (int argc, char** argv)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;QApplication &nbsp;app(argc, argv);</div><div class="code_line">&nbsp;&nbsp; &nbsp;QLabel &nbsp;lbl(&quot;&quot;, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;QLibrary &nbsp; &nbsp;lib(QDir::current().absPath() + &quot;/libdynlib&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lib.load();</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!lib.isLoaded()){lbl.setText(&quot;Library not Load&quot;);}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else {lbl.setText(&quot;Library not support this method&quot;);}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;typedef MyClassInterface* (*Fct)();</div><div class="code_line">&nbsp;&nbsp; &nbsp;Fct fct = (Fct)(lib.resolve(&quot;getMyClass&quot;));</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(fct){</div><div class="code_line">&nbsp;&nbsp; &nbsp;MyClassInterface* myClass = fct();</div><div class="code_line">&nbsp;&nbsp; &nbsp;lbl.setText(&quot;&#60;center&#62;&#60;b&#62;&quot;+ QString(myClass-&#62;getTitle()) +&quot;&#60;/b&#62;&#60;/center&#62;&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lib.unload();</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;app.setMainWidget(&amp;lbl);</div><div class="code_line">&nbsp;&nbsp; &nbsp;lbl.resize(200,100);</div><div class="code_line">&nbsp;&nbsp; &nbsp;lbl.move(350,250);</div><div class="code_line">&nbsp;&nbsp; &nbsp;lbl.show();</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return app.exec();</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Вроде всё...]]></description>
        <author>Olimpik</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204218</guid>
        <pubDate>Fri, 04 Aug 2006 10:46:24 +0000</pubDate>
        <title>Класс в динамичиской библиотеке(so, dll)</title>
        <link>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204218</link>
        <description><![CDATA[linuxfan: Просто у тебя в dynlib.h описан не интерфейс абстрактного класса, а конкретный класс и gcc справедливо ругается на то, что не может найти функций, которые у тебя лежат в .so.<br>
Сделать можно, например, так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// dynlib.h</div><div class="code_line">//////////////////////////////////////////</div><div class="code_line">#include &#60;qt.h&#62;</div><div class="code_line">/* Абстрактный интерфейс */</div><div class="code_line">class &nbsp;Q_EXPORT &nbsp;MyClassInterface</div><div class="code_line">{</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual ~MyClassInterface() {};</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual char* getTitle() = 0;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">typedef MyClassInterface* (*getInstanceProc)();</div></ol></div></div></div></div><br>
<br>
В .so вписываешь<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;dynlib.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">class MyClass : public MyClassInterface {</div><div class="code_line">&nbsp;&nbsp;/* Реализовываешь все что надо */</div><div class="code_line">&nbsp;&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual char *getTitle() {.......}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">Q_EXTERN_C Q_EXPORT MyClassInterface* getMyClass()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return new MyClass;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
И в main:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// ......</div><div class="code_line">getInstanceProc fct = (getInstanceProc)(lib.resolve(&quot;getMyClass&quot;));</div><div class="code_line">MyClassInstance = fct();</div><div class="code_line">//.....</div></ol></div></div></div></div><br>
P. S. я сразу что-то определение fct не заметил, поэтому getInstance приплел. Можно Fct оставить.]]></description>
        <author>linuxfan</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204132</guid>
        <pubDate>Fri, 04 Aug 2006 10:03:14 +0000</pubDate>
        <title>Класс в динамичиской библиотеке(so, dll)</title>
        <link>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204132</link>
        <description><![CDATA[Olimpik: Ok. Буду пробывать...<br>
<br>
О результатах сообщу... <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2006-08-04T10:30:59+00:00">04.08.06, 10:30</time></span></span><br>
Вот что у меня получилось:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// Lib //</div><div class="code_line">&nbsp;</div><div class="code_line">// dynlib.h</div><div class="code_line">//////////////////////////////////////////</div><div class="code_line">#include &#60;qt.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">class &nbsp;Q_EXPORT &nbsp;MyClass</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;MyClass();</div><div class="code_line">&nbsp;&nbsp; &nbsp;~MyClass();</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;char* getTitle();</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">Q_EXTERN_C Q_EXPORT MyClass* getMyClass()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return new MyClass;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// dynlib.cpp</div><div class="code_line">//////////////////////////////////////////</div><div class="code_line">&nbsp;</div><div class="code_line">#include &nbsp;&quot;dynlib.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">MyClass::MyClass()</div><div class="code_line">{}</div><div class="code_line">&nbsp;</div><div class="code_line">MyClass::~MyClass()</div><div class="code_line">{}</div><div class="code_line">&nbsp;</div><div class="code_line">char* MyClass::getTitle()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return &quot;I&#39;m Class MyClass&quot;;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// programm</div><div class="code_line">// main.cpp</div><div class="code_line">////////////////////////////////////////////////</div><div class="code_line">&nbsp;</div><div class="code_line">...</div><div class="code_line">#include &quot;dynlib.h&quot;</div><div class="code_line">//----------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">int main (int argc, char** argv)</div><div class="code_line">{</div><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp; &nbsp;QLibrary &nbsp; &nbsp;lib(QDir::current().absPath() + &quot;/libdynlib&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;lib.load();</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!lib.isLoaded()){lbl.setText(&quot;Library not Load&quot;);}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;typedef MyClass* (*Fct)();</div><div class="code_line">&nbsp;&nbsp; &nbsp;Fct fct = (Fct)(lib.resolve(&quot;getMyClass&quot;));</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(fct){</div><div class="code_line">&nbsp;&nbsp; &nbsp;MyClass* myClass = fct();</div><div class="code_line">&nbsp;&nbsp; &nbsp;lbl.setText(&quot;&#60;center&#62;&#60;b&#62;&quot;+ QString(myClass-&#62;getTitle()) +&quot;&#60;/b&#62;&#60;/center&#62;&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;lib.unload();</div><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return app.exec();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">bash-3.00$ make</div><div class="code_line">g++ -c -pipe -Wall -W -O2 &nbsp;-DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/lib/qt/mkspecs/default -I. -I/usr/lib/qt/include -I.ui/ -I.moc/ -o .obj/main.o main.cpp</div><div class="code_line">main.cpp:35:2: warning: no newline at end of file</div><div class="code_line">g++ -Wl,-rpath,/usr/lib/qt/lib -o main .obj/main.o &nbsp; &nbsp;-L/usr/lib/qt/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm</div><div class="code_line">.obj/main.o(.text+0x15): In function `getMyClass&#39;:</div><div class="code_line">: undefined reference to `MyClass::MyClass[in-charge]()&#39;</div><div class="code_line">.obj/main.o(.text+0x246): In function `main&#39;:</div><div class="code_line">: undefined reference to `MyClass::getTitle()&#39;</div><div class="code_line">collect2: ld returned 1 exit status</div><div class="code_line">make: *** [main] Ошибка 1</div><div class="code_line">&nbsp;</div><div class="code_line">// Errors</div><div class="code_line">//////////////////////////////////</div></ol></div></div></div></div><br>
<br>
<br>
<br>
Врозумите&#33;&#33;&#33;]]></description>
        <author>Olimpik</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204126</guid>
        <pubDate>Fri, 04 Aug 2006 09:58:04 +0000</pubDate>
        <title>Класс в динамичиской библиотеке(so, dll)</title>
        <link>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204126</link>
        <description><![CDATA[linuxfan: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=150368&view=findpost&p=1204102'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Olimpik &#064; <time class="tag-quote__quoted-time" datetime="2006-08-04T09:45:38+00:00">04.08.06, 09:45</time></span><div class='quote '>Если мой класс не наследован не от чего то, нужно заголовочный файл ещё подключать?</div></div><br>
Конечно, но это при условии (см ниже).<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=150368&view=findpost&p=1204102'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Olimpik &#064; <time class="tag-quote__quoted-time" datetime="2006-08-04T09:45:38+00:00">04.08.06, 09:45</time></span><div class='quote '>И ещё, можно ли каким либо образом использовать только dll, без хидера?</div></div><br>
Если твой класс наследуется от какого-либо базового интерфейса и тебе не нужно вызывать специфические методы, которые есть только в твоем классе, то хидер тебе не нужен, т. к. ты будешь вызывать виртуальные методы, объявленные в родительском классе, которые ты переопределил как надо.<br>
Если ты изменил интерфейс и тебе надо воспользоваться измененным интерфейсом, то без хидеров тут никак.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=150368&view=findpost&p=1204102'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Olimpik &#064; <time class="tag-quote__quoted-time" datetime="2006-08-04T09:45:38+00:00">04.08.06, 09:45</time></span><div class='quote '>А если скажем мой класс будет наследником QObject и я к нему ещё добавлю методы, то заголовочный файл так же подключать надо?</div></div><br>
Если ты будешь вызывать только те методы, которые уже содержит QObject, то не надо, в противном случае без хидера никак.]]></description>
        <author>linuxfan</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204102</guid>
        <pubDate>Fri, 04 Aug 2006 09:45:38 +0000</pubDate>
        <title>Класс в динамичиской библиотеке(so, dll)</title>
        <link>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204102</link>
        <description><![CDATA[Olimpik: Вот вот по поводу унаследован. Если мой класс не наследован не от чего то, нужно заголовочный файл ещё подключать?<br><br>А если  скажем мой класс будет наследником QObject и я к нему ещё добавлю методы, то заголовочный файл так же подключать надо?<br><br>И ещё, можно ли каким либо образом использовать только dll, без хидера?]]></description>
        <author>Olimpik</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204070</guid>
        <pubDate>Fri, 04 Aug 2006 09:33:03 +0000</pubDate>
        <title>Класс в динамичиской библиотеке(so, dll)</title>
        <link>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204070</link>
        <description><![CDATA[linuxfan: Если речь идет о кроссплатформенном способе, то в dll надо вписать функции примерно такого вида:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">extern &quot;C&quot; MyClassInterface* createMyClassInstance() {</div><div class="code_line">&nbsp;&nbsp;return new MyClass();</div><div class="code_line">}</div></ol></div></div></div></div><br>
Соответственно в своем приложении ты подцепляешь эту библиотеку (через dlopen/LoadLibrary или динамической линковкой -- это как больше нравится) и просто вызываешь createMyClassInstance.<br>
Предполагается, что MyClass унаследован от MyClassInterface.]]></description>
        <author>linuxfan</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204045</guid>
        <pubDate>Fri, 04 Aug 2006 09:19:12 +0000</pubDate>
        <title>Класс в динамичиской библиотеке(so, dll)</title>
        <link>https://forum.sources.ru/index.php?showtopic=150368&amp;view=findpost&amp;p=1204045</link>
        <description><![CDATA[Olimpik: Здравствуте&#33;<br><br>Что делаю: мне надо написать динамически подгружаемую библиотеку(so или dll) в котором будет описан некий класс, затем, подгрузив библиотеку, создать экземпляр класса, хранящегося в библиотеке, и работать с ним.<br><br>Могу сказать, что попытки с моей стороны были&#33; Точнее библиотеку с классом я написал(вроде как, т.е. она компилится и создаётся без проблем), но вот как получить правилино создать экземпляр класса вопрос...<br><br>Вопрос такой: Как это реализовать с помощью Qt (грамотно)? <br><br>P.S. Примерчик бы..<br>С уважением, Алексей&#33;]]></description>
        <author>Olimpik</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	