Мне нужна помощь с добавлением файлов в базу кода путем добавления их в систему сборки autotools. Другие сообщения , которые пытаются ответить на тот же вопрос, мне не помогли. Я экспериментирую с кодовой базой Биткойн и пытаюсь добавить в нее новые файлы. Я пытаюсь добавить статическую библиотеку в src/Makefile.am, добавив следующие строки:
LIBGLYPH=libglyph.a
libglyph_a_SOURCES = \
glyph/glp.c \
glyph/glp_utils.c \
glyph/glp_rand.c \
glyph/glp_rand_openssl_aes.c \
glyph/FFT/FFT_1024_65537.c \
glyph/converter.c
libglyph_a_CPPFLAGS = $(AM_CPPFLAGS)
libglyph_a_CFLAGS =
libglyph_a_CXXFLAGS = $(AM_CXXFLAGS)
EXTRA_LIBRARIES += \
$(LIBBITCOIN_CRYPTO) \
$(LIBBITCOIN_UTIL) \
$(LIBBITCOIN_COMMON) \
$(LIBGLYPH) \
$(LIBBITCOIN_CONSENSUS) \
$(LIBBITCOIN_SERVER) \
$(LIBBITCOIN_CLI) \
$(LIBBITCOIN_WALLET) \
$(LIBBITCOIN_ZMQ)
bitcoin_tx_LDADD = \
$(LIBUNIVALUE) \
$(LIBBITCOIN_COMMON) \
$(LIBBITCOIN_UTIL) \
$(LIBBITCOIN_CONSENSUS) \
$(LIBBITCOIN_CRYPTO) \
$(LIBGLYPH) \
$(LIBSECP256K1)
bitcoind_LDADD = \
$(LIBBITCOIN_SERVER) \
$(LIBBITCOIN_COMMON) \
$(LIBUNIVALUE) \
$(LIBBITCOIN_UTIL) \
$(LIBBITCOIN_WALLET) \
$(LIBBITCOIN_ZMQ) \
$(LIBBITCOIN_CONSENSUS) \
$(LIBBITCOIN_CRYPTO) \
$(LIBLEVELDB) \
$(LIBLEVELDB_SSE42) \
$(LIBMEMENV) \
$(LIBGLYPH) \
$(LIBSECP256K1)
Я предпринял как минимум 30 различных попыток компиляции, в которых я переупорядочивал компиляцию и/или переименовывал библиотеку.
Ошибка:
make[3]: Entering directory '/home/joe/glyph/glyphCodebase/BitcoinUnlimited/src/secp256k1'
make[3]: Leaving directory '/home/joe/glyph/glyphCodebase/BitcoinUnlimited/src/secp256k1'
CXXLD bitcoind
libbitcoin_common.a(libbitcoin_common_a-key.o): In function `CKey::MakeNewKey()':
/home/joe/glyph/glyphCodebase/BitcoinUnlimited/src/key.cpp:25: undefined reference to `glp_gen_sk(glp_signing_key_st*)'
libbitcoin_common.a(libbitcoin_common_a-key.o): In function `CKey::GetPubKey() const':
/home/joe/glyph/glyphCodebase/BitcoinUnlimited/src/key.cpp:48: undefined reference to `glp_gen_pk(glp_public_key_st*, glp_signing_key_st)'
collect2: error: ld returned 1 exit status
Makefile:3556: recipe for target 'bitcoind' failed
make[2]: *** [bitcoind] Error 1
make[2]: Leaving directory '/home/joe/glyph/glyphCodebase/BitcoinUnlimited/src'
Makefile:9207: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/joe/glyph/glyphCodebase/BitcoinUnlimited/src'
Makefile:670: recipe for target 'all-recursive' failed
make: *** [all-recursive] Error 1
Эта ошибка возникает несмотря на то, что файл libglyph.a создан и содержит функции. Я попытался добавить заголовок библиотеки и файлы C в общую библиотеку, но безуспешно. Я переупорядочил раздел EXTRA_LIBRARIES на Makefile.am, но безуспешно.
Чтобы упростить проблему, вот действительно простой пример, который выдает ту же ошибку:
Добавление 1 файла .h и 1 файла .cpp в 1 уже созданную библиотеку: libbitcoin_common новые файлы:src/testFile.cpp src/testFile.h
testFile.h:
void testFunction();
testFile.cpp
#include "testFile.h"
#include <stdio.h>
void testFunction() {
printf("I am a test function");
}
в key.cpp добавлены следующие строки:
#include "testFile.h"
void CKey::MakeNewKey()
{
testFunction();
...
...
...
}
Затем в src/Makefile.am
BITCOIN_CORE_H = \
testFile.h \
...
...
и testFile в общую библиотеку, где находится key.cpp, как упоминал здесь Питер Вуилле.
# common: shared between bitcoind, and bitcoin-qt and non-server tools
libbitcoin_common_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
libbitcoin_common_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libbitcoin_common_a_SOURCES = \
amount.cpp \
base58.cpp \
chainparams.cpp \
coins.cpp \
compressor.cpp \
core_read.cpp \
core_write.cpp \
keystore.cpp \
netaddress.cpp \
netbase.cpp \
protocol.cpp \
scheduler.cpp \
script/sign.cpp \
script/standard.cpp \
key.cpp \
testFile.cpp \
$(BITCOIN_CORE_H)
Ошибка:
libbitcoin_common.a(libbitcoin_common_a-key.o): In function
`CKey::MakeNewKey()':
/home/joe/glyph/glyphCodebase/BitcoinUnlimited/src/key.cpp:23: undefined reference to `testFunction()
Пожалуйста, помогите мне с этим. Большое спасибо
Добавить один исходный файл и заголовок проще, чем добавить новую библиотеку.
Для одного исходного файла этот файл должен предшествовать любому файлу, который от него зависит. Итак, в вашем примере у вас должно быть
...
testFile.cpp \
key.cpp \
...
Но вы действительно пытаетесь добавить новую библиотеку. Для этого вам нужно добавить его к bitcoind_LDADD
тому, что находится ниже в Makefile.am
. Таким образом, компоновщик знает, как его связать. Для компоновщика зависимости должны быть размещены после того, что от них зависит. Таким образом, вы можете просто добавить $(LIBGLYPH)
в конец этого списка.
Было 2 проблемы с кодом:
Всем, кто хочет увидеть мой makefile.am, перейдите сюда: https://drive.google.com/file/d/1eB_EnxfSG1erRgDpDNgU_q-PzPQYs0hp/view?usp=sharing
Системы сборки, как известно, разочаровывают. Если у вас есть вопросы, оставьте комментарий или спросите меня.
Джо Н
CKey::MakeNewKey()': /home/joe/glyph/glyphCodebase/BitcoinUnlimited/src/key.cpp:23: undefined reference to
testFunction()'Джо Н
Эндрю Чоу
bitcoin_tx_LDADD
тоже. Можете ли вы обновить свой вопрос полным выводом команды make?Эндрю Чоу
autogen.sh
иconfigure
после изменения make-файла?Джо Н
Эндрю Чоу
EXTRA_LIBRARIES
пытались поставить libglyph перед libbitcoin_common?Джо Н
Джо Н