Agregar nuevos archivos a Makefile.am

Necesito ayuda para agregar archivos a la base del código agregándolos al sistema de compilación de autotools. Otras publicaciones que intentan responder la misma pregunta no me han ayudado. Estoy experimentando con la base de código de Bitcoin y estoy tratando de agregar nuevos archivos a la base de código. Estoy tratando de agregar una biblioteca estática en src/Makefile.am agregando estas líneas:

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)

Probé al menos 30 intentos de compilación diferentes en los que reordené la compilación y/o cambié el nombre de la biblioteca.

Error:

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

Este error ocurre a pesar de que se ha creado libglyph.a y contiene las funciones. Intenté agregar el encabezado de la biblioteca y los archivos C a la biblioteca común sin suerte tampoco. He reorganizado la sección EXTRA_LIBRARIES de Makefile.am sin suerte.


Para simplificar el problema, aquí hay un ejemplo realmente simple que escupe el mismo error:

Agregar 1 archivo .h y 1 .cpp a 1 biblioteca ya creada: libbitcoin_common archivos nuevos:src/testFile.cpp src/testFile.h

archivo de prueba.h:

void testFunction();

testFile.cpp

#include "testFile.h"
#include <stdio.h>

void testFunction() {
    printf("I am a test function");
}

agregó las siguientes líneas a key.cpp:

#include "testFile.h"

void CKey::MakeNewKey()
{
    testFunction();
     ...
     ...
     ...
}

Luego en src/Makefile.am

BITCOIN_CORE_H = \
testFile.h \
...
...

y testFile a la biblioteca común, donde está key.cpp, como lo menciona Pieter Wuille aquí

# 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)

El error:

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()

Por favor, me ayudas con ésto. Muchas gracias

Respuestas (2)

Agregar un solo archivo de origen y encabezado es más fácil que agregar una nueva biblioteca.

Para un archivo fuente único, el archivo debe estar antes que cualquier archivo que dependa de él. Entonces, en tu ejemplo, deberías tener

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

Pero realmente está tratando de agregar una nueva biblioteca. Para hacer eso, debe agregarlo a bitcoind_LDADDlo que está más abajo en Makefile.am. De esa manera el enlazador sabe enlazarlo. Para el enlazador, las dependencias deben colocarse después de las cosas que dependen de él. Entonces, solo puede agregar $(LIBGLYPH)al final de esa lista debería funcionar.

Wow gracias por una respuesta tan rápida! Intenté reorganizarlo y obtuve el mismo error: 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()'
También agregué LIBGLYPH a bitcoind_LDADD y probé agregándolo arriba y abajo y eso tampoco funcionó
Es posible que deba agregarlo bitcoin_tx_LDADDtambién. ¿Puede actualizar su pregunta con el resultado completo del comando make?
Además, ¿te acordaste de volver a ejecutar autogen.shy configuredespués de modificar el archivo MAKE?
Actualicé la publicación con todos los cambios que hice. Los dejé fuera al principio porque pensé que sería demasiada información. No funciona con la adición de bitcoin_tx_LDADD. También probé las fuentes y la sección cxx, todas con libbitcoin_glyph como nombre y glyph_libbitcoin_glyph_a en lugar de libglyph_a y eso no funcionó. Uso ./autogen.sh y ./configure cada vez que hago un cambio. Aquí está el archivo si quieres verlo: drive.google.com/file/d/1eB_EnxfSG1erRgDpDNgU_q-PzPQYs0hp/…
En EXTRA_LIBRARIES, ¿ha intentado poner libglyph antes de libbitcoin_common?
¡Me lo imaginé! El problema es que el compilador de C++ no pudo encontrar dónde estaban las definiciones de función porque estaban en C. Envolví las funciones en "C" externa {...} pero ahora tengo un error: /usr/bin/ld: libglyph.a(libglyph_a-glp.o): la reubicación R_X86_64_32S contra `.rodata' no se puede usar cuando se crea un objeto compartido; vuelva a compilar con -fPIC libglyph.a: error al agregar símbolos: valor incorrecto. Lo que significa que tengo que usar un comodín (como lo hace secp256k1).
mira mi respuesta

Hubo 2 problemas con el código:

  1. no puede compilar código c con un compilador c ++ sin "C" externo en los archivos de encabezado del código C. https://stackoverflow.com/questions/12066279/using-c-libraries-for-c-programs
  2. -fPIC podría tener que usarse al compilar el código C (agregarlo a las banderas). Usé liblibraryName_a_CFLAGS = -fPIC y liblibraryName_a_CXXFLAGS = -fPIC

Para cualquiera que quiera ver mi makefile.am, vaya aquí: https://drive.google.com/file/d/1eB_EnxfSG1erRgDpDNgU_q-PzPQYs0hp/view?usp=sharing

Los sistemas de construcción son notoriamente frustrantes. Si tienes dudas, deja un comentario o pregúntame.