LINUX.ORG.RU

Линкование C-библиотек к C++ проекту

 


0

1

Взял готовую библиотеку, компильнул.... всё норм... теперь радостно прикручиваю её к С++ проекту (причём в среде Eclipse)... а она не хочет компилиться... Если создаю в Eclipse С-проект, то работает на ура... но нужен С++ проект

В чём может быть проблема?

Взял готовую библиотеку, компильнул.... всё норм... теперь радостно прикручиваю её к С++ проекту (причём в среде Eclipse)... а она не хочет компилиться...

что за библиотека? Если это shared, то зачем компилить? А если статичная, то почему не shared?

да, найди где у тебя там ld вызывается, и пропиши туда свою библиотеку, если она статическая. И пофиг, хоть она на бейсике, лишь бы стандарт ld (object files) соблюдался.

emulek
()
Последнее исправление: emulek (всего исправлений: 1)
Ответ на: комментарий от sitev_ru

дык скомпиляй её отдельно, останови в систему, и пропиши в /etc/ld.so.conf (man ldconfig)

и да, компиляй с ключом -lfcgi но БЕЗ этой либы. Либу программа сама самостоятельно должна найти, когда загрузится.

emulek
()

В чём может быть проблема?

В том, что Це и ЦПП — это два разных языка. Собирай библиотеку отдельно, зачем обязательно вместе со своим проектом это делать?

Gvidon ★★★★
()
Ответ на: комментарий от emulek

дык скомпиляй её отдельно, останови в систему, и пропиши в /etc/ld.so.conf (man ldconfig)

Ахах, девелопментпроцесс через боль.

а) останавливать систему нинужно (а может быть и нельзя)

б) рассказать ld, что такая либа есть можно без перезагрузки несколькими способами, особенно если она используется только в разрабатываемом приложении :)

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

останавливать систему нинужно

опечатка s/останови в систему/установи в систему/

рассказать ld, что такая либа есть можно без перезагрузки несколькими способами, особенно если она используется только в разрабатываемом приложении

естественно.

Речь о том, что не важно, что либа написана не на C++.

emulek
()
Ответ на: комментарий от Reset

За такой «полезный» совет за яйца вешать надо.

за яйца нужно вешать тех разработчиков, чей код тянет за собой Over9000 своих *.DLL файлов.

Прости, но здесь так не принято.

emulek
()
Ответ на: комментарий от Reset

Ога, зато «принято» прописать в систему левые DLL.

если это система разработчика, то почему нет? Конечно, если либа действительно «левая», то её необходимо должным образом опакетить, что-бы она сама прописывалась, как принято в _этом_ дистре. Но это уже вопрос дистрибуции, а не разработки. Если ты совсем в танке, то прописывать заказчику в продакшен левые либы никто не предлагал. Это у тебя глюки.

И да, Fast CGI не такая уж и «левая».

emulek
()
Ответ на: комментарий от tailgunner

Тебя гнать от разработки поганой метлой надо!

Проще будет казнить.

не дождётесь!

emulek
()
Ответ на: комментарий от emulek

Это вопрос культуры разработки. Если у разработчика вакханалия на машине, то будут проблемы при внедрении и эксплуатации этого софта и еще большие проблемы будут при увольнении такого работника, поэтому желательно гнать таких заблаговременно.

Reset ★★★★★
()
Ответ на: комментарий от Reset

давай ты сначала разузнаешь, куда, как, и что прописывает в Linux файлы *.so, а потом будешь рассуждать, хорошо?

emulek
()
Ответ на: комментарий от emulek

Никуда не надо ничего прописывать. Если библиотека не стандартная, то положи её в дерево проекта в contrib и собирай в рамках всего проекта. В том же cmake это делается элементарно.

Reset ★★★★★
()

extern «C» тут уже упоминали?

Harald ★★★★★
()
Ответ на: комментарий от pozitiffcat

Вы меня ни с кем не перепутали?

этот анонимус всегда всё путает. Например он меня перепутал с кем-то, кто что-то про деструкторы говорил, а теперь тебя перепутал со мной. Рекурсия IRL.

emulek
()
Ответ на: комментарий от Reset

ПО может состоять из нескольких компонентов.

значит ты согласен, что «класть в дерево» нужно не любую библиотеку и не всегда?

emulek
()
Ответ на: комментарий от emulek

Я такого никогда не утверждал и вообще я не вижу связи между shared и твоим выводом. Библиотека в дереве, внезапно, может собираться в static.

Reset ★★★★★
()
Ответ на: комментарий от tailgunner

Например, чтобы менять её вне зависимости от приложения // К.О.

ага, но тогда зачем оно должно быть обязательно в дереве проекта, а не отдельно?

emulek
()
Ответ на: комментарий от Reset

Я такого никогда не утверждал и вообще я не вижу связи между shared и твоим выводом. Библиотека в дереве, внезапно, может собираться в static.

но мы-то про shared! Я ведь в самом начале треда это уточнил.

emulek
()
Ответ на: комментарий от emulek

Например, чтобы менять её вне зависимости от приложения // К.О.

ага, но тогда зачем оно должно быть обязательно в дереве проекта, а не отдельно?

Чтобы всё, что нужно для проекта, можно было получить одной hg clone // К.О.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Например, чтобы менять её вне зависимости от приложения // К.О.

ага, но тогда зачем оно должно быть обязательно в дереве проекта, а не отдельно?

Чтобы всё, что нужно для проекта, можно было получить одной hg clone // К.О.

твой К.О. слышал о ВП?

emulek
()
Ответ на: комментарий от Reset

Принципиальной разницы нет. Культура разработки, внезапно, не зависит от типа библиотеки.

ясно, спасибо.

emulek
()
Ответ на: комментарий от emulek

Например, чтобы менять её вне зависимости от приложения // К.О.

ага, но тогда зачем оно должно быть обязательно в дереве проекта, а не отдельно?

Чтобы всё, что нужно для проекта, можно было получить одной hg clone // К.О.

твой К.О. слышал о ВП?

Расскажи, где именно ты увидел ВП.

tailgunner ★★★★★
()
Ответ на: комментарий от slackwarrior

Не останови, а установи, наверное он хотел сказать.

2ТС, так кто тебе запрещает? Веселее, когда надо в Си использовать библиотеку С++. Ну, на самом деле просто, всего-то обернуть функции в extern «C».

a1batross ★★★★★
()
Ответ на: комментарий от emulek

менять её вне зависимости

т.е. не входит в проект

False

одной hg clone

т.е. входит в проект

Да. Ты слышал о third-party libraries?

tailgunner ★★★★★
()

(ЛОР-игзперды в своём репертуаре. Только ОДИН из 30 комментов — по теме, остальные — от олигофренов, не имеющих о ней представления.)

ТС, тебе нужно объявить символы этой библиотеки как extern «C», чтобы отключить плюсовый name-mangling (и погугли, для общего развития, что это такое). В общем случае как-то так:

extern "C" {
#include <тут header библиотеки>
}
alegz ★★★★
()
Ответ на: комментарий от alegz

Только ОДИН из 30 комментов — по теме

Д'Артаньян в треде, все в машину!

anonymous
()
16 марта 2015 г.
Ответ на: комментарий от emulek

за яйца нужно вешать тех разработчиков, чей код тянет за собой Over9000 своих *.DLL файлов.

лорчую. вместе с использующими статическую линковку.

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