LINUX.ORG.RU

Статическая линковка C++ библиотеки к С модулю


0

0

Только ногами не бейте. Хочу узнать можно ли как-нибудь код написанный на плюсах собрать вместе с кодом на С, но не загоняя плюсовый код в разделяемую библиотеку, причем результат должен быть: C shared library. Заранее спасибо.


Вообще-то, не совсем понятно, что именно ты хочешь сделать. Если ты говоришь про объектный код, то его можно, например, скомпилить в Виндах, а потом слинковать в Линуксе на платформе с тем же процессором, и не будет никаких проблем. В общем, по-понятнее, если можно, изложи суть. :)

Akan
()

Есть код на С который должен компилироваться в .so (модуль. И есть lib'а на С++ в исходниках. Я хочу ее использовать в модуле, но мне важно чтобы для модуля lib'а не была shared, так как тогда с модулем будет еще один файл, что нежелательно. Вопрос в том как это организовать.
Про объектный код, если я правильно понял тебя то вопрос как слинковать объектник написанный на С++ с объектником на C так чтобы приложение к которому этот модуль подлинковывается при старте могло
резолвить С++ связи. У меня при старте основного приложения с модулем, полученным из 2-х объектников происходила ошибка:
Undefined symbol __builtin_new.
Если же я из С++ либы делаю shared library и линкую остальные
объектники модуля с ней то все работает отлично

P.S. Надеюсь изложил понятнее.

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

"Undefined symbol __builtin_new" возникает потому что требуется libstdc++. Чтобы этого избежать, попробуй скомпилить плюсовые исходники не g++ а gcc. В этом случае libstdc++ прилинковывается статически. Но размер файла, естественно, будет больше (ненамного, ~20K). Если этого не хочется, то для линковки своей проги укажи дополнительную либу: -lstdc++. А еще, наверно, можно попробовать компилить твою си-прогу g++ (правда, этого я не пробовал :).

nobody ★★
()

Mozno no nado pomnit chto v C++ funkcii imenuyutsya ne tak kak v C t.e. esli u tebya est v C++ foo() to vyzyvat iz C ee nado kak foo_v() kazhetsya voobshe kogda mne nado bylo C++ libu prilinkovat k Apache ya smotrel nm kak zovutsya funkcii i vyzyval ih sootv. obrazom .

master
()

2nobody:
Сделал несколько подругому:
1) Закомпилил С++ либу g++, получил объектник.
2) После чего слинковал объектники основного сишного модуля с либой
с -lstdc++ после чего все вроде бы заработало.

2master:
Кстати (по поводу имен):
Мне посоветовали в С++ либе перед функциями которые я вызываю из С
писать extern "C" вроде это работает, за исключением того, что если я
принимаю int*, то это конвертается g++ в int*&.

Всем спасибо за советы.

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