Я пытаюсь скомпилировать программу в моей системе с Debian Wheezy и g ++ 4.7. Я хочу, чтобы он мог работать в другой системе с Debian Squeeze (и без недавнего g ++). Я не могу скомпилировать программу на Squeeze, потому что я использую определенные C++11
Возможности старого g ++ не поддерживаются, а также новая версия Boost и libcrypto ++ 9.
Насколько я понимаю, обычным способом решения этой проблемы является статическое связывание библиотек, не поддерживаемых в другой системе, в моем случае 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)
У меня возникла та же проблема, и это связано с тем, что вы пытаетесь смешать код, сгенерированный g ++ — 4.7 (ваша программа), с кодом, сгенерированным предыдущей версией g ++ (библиотека cryptopp).
Причиной этого является то, что когда вы выполняете компиляцию, библиотека выполняет make
команда, она использует версию по умолчанию g++
настроить для вашей системы, обычно ту, которая поставляется с ОС.
Чтобы решить проблему, вам нужно скомпилировать cryptopp
библиотека с g++-4.7
,
Для этого скомпилируйте библиотеку, выполнив make CXX=g++-4.7
, Результирующая статическая библиотека не должна выдавать ошибку при соединении с вашим кодом.
Других решений пока нет …