Добавление новых файлов в Makefile.am

Мне нужна помощь с добавлением файлов в базу кода путем добавления их в систему сборки 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()

Пожалуйста, помогите мне с этим. Большое спасибо

Ответы (2)

Добавить один исходный файл и заголовок проще, чем добавить новую библиотеку.

Для одного исходного файла этот файл должен предшествовать любому файлу, который от него зависит. Итак, в вашем примере у вас должно быть

...
testFile.cpp \
key.cpp \
...

Но вы действительно пытаетесь добавить новую библиотеку. Для этого вам нужно добавить его к bitcoind_LDADDтому, что находится ниже в Makefile.am. Таким образом, компоновщик знает, как его связать. Для компоновщика зависимости должны быть размещены после того, что от них зависит. Таким образом, вы можете просто добавить $(LIBGLYPH)в конец этого списка.

Вау спасибо за такой быстрый ответ! Я попытался переставить его и получил ту же ошибку: libbitcoin_common.a(libbitcoin_common_a-key.o): в функции CKey::MakeNewKey()': /home/joe/glyph/glyphCodebase/BitcoinUnlimited/src/key.cpp:23: undefined reference to testFunction()'
Я также добавил LIBGLYPH к bitcoind_LDADD и протестировал добавление его сверху и снизу, но это тоже не сработало.
Возможно, вам придется добавить его bitcoin_tx_LDADDтоже. Можете ли вы обновить свой вопрос полным выводом команды make?
Кроме того, вы не забыли перезапустить autogen.shи configureпосле изменения make-файла?
Я обновил пост со всеми изменениями, которые я сделал. Сначала я их пропустил, потому что думал, что это будет слишком много информации. Не работает с дополнением bitcoin_tx_LDADD. Я также попробовал исходники и раздел cxx с libbitcoin_glyph в качестве имени и glyph_libbitcoin_glyph_a вместо libglyph_a, и это не сработало. Я использую ./autogen.sh и ./configure каждый раз, когда вношу изменения. Вот файл, если хотите: drive.google.com/file/d/1eB_EnxfSG1erRgDpDNgU_q-PzPQYs0hp/…
Вы EXTRA_LIBRARIESпытались поставить libglyph перед libbitcoin_common?
Я понял! Проблема в том, что компилятор C++ не смог найти, где находятся определения функций, потому что они были на C. Я завернул функции в extern "C" { ... }, но теперь у меня ошибка: /usr/bin/ld: libglyph.a(libglyph_a-glp.o): перемещение R_X86_64_32S против `.rodata' нельзя использовать при создании общего объекта; перекомпилировать с -fPIC libglyph.a: ошибка добавления символов: неверное значение. Это означает, что я должен использовать подстановочный знак (как это делает secp256k1).
Проверьте мой ответ

Было 2 проблемы с кодом:

  1. вы не можете скомпилировать код C с помощью компилятора C++ без extern "C" в файлах заголовков кода C. https://stackoverflow.com/questions/12066279/using-c-libraries-for-c-programs
  2. -fPIC, возможно, придется использовать при компиляции кода C (добавьте его в флаги). Я использовал liblibraryName_a_CFLAGS = -fPIC и liblibraryName_a_CXXFLAGS = -fPIC

Всем, кто хочет увидеть мой makefile.am, перейдите сюда: https://drive.google.com/file/d/1eB_EnxfSG1erRgDpDNgU_q-PzPQYs0hp/view?usp=sharing

Системы сборки, как известно, разочаровывают. Если у вас есть вопросы, оставьте комментарий или спросите меня.