2016-02-13 2 views
-1

Я завернул свой заголовочный файл C++ во внешнем блоке «C», чтобы разрешить вызывать функции C++ из C. Я включил правильные файлы заголовков в нужные места. Это работает, если я что-то вроде следующего:lstd ++ & extern - вызов C++ из C

g++ -c cpp_src.cc 
gcc -c c_src.c 
gcc -o c_exe c_src.o cpp_src.o -lstdc++ 

Но если я удалить -lstdC++ из последней строки, я получаю кучу ошибок. Из-за неподконтрольных мне причин я не могу добавить флаг -lstdC++. Есть ли способ заставить выше работать без -lstdC++? Что такое lstdC++, как в том, как gcc использует его при связывании с компилируемым кодом g ++?

Кроме того, cpp_src.cc использует STL, если это имеет значение.

+1

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что ОП ставит нереалистичные требования к решениям ... Должен использовать C++, но не может связывать библиотеки C++. –

+3

@DavidHoelzer Если вы не хотите отвечать на него, тогда не делайте этого, но не злоупотребляйте привилегиями вашего близкого друга. –

+0

Спасибо за ваше мнение. –

ответ

4

Если вы действительно необходимо иметь объектный файл, который можно связать с помощью GCC без использования -lstdC++, вы можете сделать добавочную ссылку вашего ++ объекта файла C с -lstdC++ и затем использовать результат того, что на вашем НКУ линии связи. Что-то вроде:

ld -i -static cpp_src.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -lstdc++ -o cpp_withstdlib.o 

Это будет связать ++ объектный файл C с стандартной библиотеки C++ и создавать новый объект файл (cpp_withstdlib.o), который содержит все стандартные C++ библиотеки вещи вам нужно, так что может быть связано с ССАГПЗ командой линии без необходимости -lstdc++

хитрой части является -L варианта - вам нужно выяснить, где г ++ имеет прятал свою стандартную библиотеку, как правило, не ставит его в стандартном /usr/lib места. Вышеуказанное относится к машине Ubuntu 14.04. На большинстве Linux-машин вы можете найти его с помощью locate libstdc++.a

Вы, как правило, лучше используете g++, чтобы связать код на C++, так как он знает все правильные пути и не будет делать небольшие ошибки, которые приводят к тому, что двоичный файл похоже, работает, но на самом деле неверно.


Используя предложение Джоша, вы можете сделать:

ld -i -static cpp_src.o `g++ -print-file-name=libstdc++.a` -o cpp_withstdlib.o 

который немного чище, и может быть легко сделано в Makefile.

+1

Классный! (И кто-то собирается загорать меня в 3..2..1 ..) –

+0

Вы можете найти расположение libstdC++. A с ''g ++ -print-file-name = libstdC++. A''. Кредит отправляется на сайт http://www.trilithium.com/johan/2005/06/static-libstdc. –

2

-lstdc++ заставляет компоновщик ссылаться на libstdc++, что является реализацией gcc стандартной библиотеки C++. Если ваш код использует любые символы из стандартной библиотеки (он использует стандартную библиотеку, а не весь код встроен из заголовков), он должен ссылаться на libstdc++ (или какую бы стандартную библиотечную реализацию вы не использовали).

Вы можете избежать стандартной библиотеки, или вы можете связать ее со стандартной библиотекой системы, или вы можете статически связать копию стандартной библиотеки с вашей программой.

+1

На самом деле это стандартная библиотека C++ со всеми вещами в пространстве имен 'std ::'. STL - лишь малая его часть. –

+0

К сожалению, я не могу избежать STL; «вы можете статически связать копию STL в вашей программе» - это кажется многообещающим. Любые указатели на то, как это сделать? – user5527407

+0

Вам все равно нужно использовать '-l' для статической ссылки. В какой-то момент вы должны сослаться на эту библиотеку, чтобы либо динамически ссылаться на функции, либо импортировать их непосредственно в ваш двоичный файл. –