2013-04-26 2 views
3

Я пытаюсь скомпилировать программу в своей системе с Debian Wheezy и g ++ 4.7. Я хочу, чтобы он мог работать в другой системе с помощью Debian Squeeze (и не был последним g ++). Я не могу скомпилировать программу на Squeeze, потому что я использую некоторые функции C++11, которые старый g ++ не поддерживает, а также новую версию Boost и libcrypto ++ 9.Статическая ссылка на libcrypto ++, с g ++

Насколько я понимаю, обычный способ обойти эту проблему заключается в статическую ссылку библиотека не поддерживается в другой системе, в моем случае libstdc, boost и crypto++.

Мой вызов (соединение) составитель прямо сейчас

g++-4.7 .obj/btcmirco.o -Wl,-Bstatic -lboost_program_options -lboost_system -lcrypto++ -Wl,-Bdynamic -lcurl -static-libgcc -std=c++11 -o MyProgram 

Однако я, кажется, что-то пропустил, потому что он выбрасывает много неопределенных ссылочных ошибок. Он отлично работает, если я динамически ссылаюсь на crypto++ (и только статические ссылки libstdc и boost).

Может ли кто-нибудь сказать мне, что случилось, или если в моем подходе произошла фундаментальная ошибка?

Ошибка линкера я получаю (замкнут):

`.text._ZN8CryptoPP22BufferedTransformationD2Ev' referenced in section `.text._ZN8CryptoPP22BufferedTransformationD1Ev[_ZN8CryptoPP22BufferedTransformationD1Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o): defined in discarded section `.text._ZN8CryptoPP22BufferedTransformationD2Ev[_ZN8CryptoPP22BufferedTransformationD5Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o) 
`.text._ZN8CryptoPP25MessageAuthenticationCodeD2Ev' referenced in section `.text._ZN8CryptoPP25MessageAuthenticationCodeD1Ev[_ZN8CryptoPP25MessageAuthenticationCodeD1Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o): defined in discarded section `.text._ZN8CryptoPP25MessageAuthenticationCodeD2Ev[_ZN8CryptoPP25MessageAuthenticationCodeD5Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o) 
+0

Я подал заявку # 708370 об этом – wRAR

ответ

2

я испытал те же проблемы, и это связанно с тем, что вы пытаетесь смешать код, сгенерированный г ++ - 4.7 (программа) с кодом, сгенерированным предыдущей версией g ++ (библиотека cryptopp).

Причина в том, что при выполнении компиляции библиотеки, выполняющей команду make, она использует стандартную версию g++, настроенную для вашей системы, обычно такую, которая поставляется с ОС.

Для решения проблемы необходимо выполнить компиляцию cryptopp библиотеки с g++-4.7. Для этого скомпилируйте библиотеку, выполнив make CXX=g++-4.7. Полученная статическая библиотека не должна давать вам ошибку при привязке к вашему коду.

+0

Спасибо за ваш ответ. Я не тестировал, но думаю, это сработает, если у вас будет такая же проблема. Но почему проблема возникает, если я статическую ссылку, а не если я использую динамическую ссылку? Разве это не должно вызывать те же ошибки (либо во время компиляции, либо во время выполнения)? – Haatschii

Смежные вопросы