Код не создается, когда я разделяю компиляцию и компоновку - PullRequest
0 голосов
/ 06 июня 2018

У меня есть файл с именем main.cpp, и я использую общую библиотеку с полным путем: «/usr/local/lib/libcryptopp.a», а мой каталог включения: «/usr/local/include/cryptopp».

Когда япопробуйте выполнить сборку с помощью этой команды:

g++ -o crypto -g main.cpp -I /usr/local/include/cryptopp /usr/local/lib/libcryptopp.a

Код строится идеально, и создается исполняемый файл "crypto".Однако, когда я разделяю компиляцию и связывание следующим образом:

g++ -c -g -I/usr/local/include/cryptopp -o main.o main.cpp
g++ -o crypto main.o -L/usr/lib64 /usr/local/lib/libcryptopp.a

, я получаю следующие ошибки:

/usr/local/lib/libcryptopp.a(algparam.o): In function `CryptoPP::CombinedNameValuePairs::~CombinedNameValuePairs()':
/home/stsadm/JJ/algparam.h:135: undefined reference to `operator delete(void*, unsigned long)'
/usr/local/lib/libcryptopp.a(pubkey.o): In function `CryptoPP::P1363_MGF1KDF2_Common(CryptoPP::HashTransformation&, unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, bool, unsigned int)':
/home/stsadm/JJ/pubkey.cpp:17: undefined reference to `operator delete(void*, unsigned long)'
/usr/local/lib/libcryptopp.a(pubkey.o): In function `CryptoPP::PK_SignatureScheme::InvalidKeyLength::~InvalidKeyLength()':
/home/stsadm/JJ/cryptlib.h:2459: undefined reference to `operator delete(void*, unsigned long)'
/usr/local/lib/libcryptopp.a(pubkey.o): In function `CryptoPP::PK_SignatureScheme::KeyTooShort::~KeyTooShort()':
/home/stsadm/JJ/cryptlib.h:2469: undefined reference to `operator delete(void*, unsigned long)'
/usr/local/lib/libcryptopp.a(pubkey.o): In function `CryptoPP::HashFilter::~HashFilter()':
/home/stsadm/JJ/filters.h:517: undefined reference to `operator delete(void*, unsigned long)'

И у меня есть , чтобы заставить работать отдельный путьпо несвязанным причинам.Любые идеи, почему разделенная версия дает мне ошибки связывания?

1 Ответ

0 голосов
/ 07 июня 2018

есть идеи, почему включение дополнительного (хотя и ненужного) каталога библиотеки вызывает проблемы?

Единственная причина, которую я могу увидеть, это если у вас libstdc++.a или libstdc++.so в /usr/lib64, и эта библиотека каким-то образом повреждена или просто отсутствует ::operator delete по какой-то (неожиданной) причине.

Чтобы узнать, какая (не повреждена) libstdc++ подобран по "обычной" ссылке, сделайте так:

g++ -o crypto main.o /usr/local/lib/libcryptopp.a -Wl,-y,_ZdlPvm
...