Blockchain

向 Makefile.am 添加新文件

  • January 8, 2018

通過將文件添加到自動工具建構系統中,我需要一些幫助來將文件添加到程式碼庫中。其他試圖回答相同問題的文章對我沒有幫助。我正在試驗比特幣的程式碼庫,我正在嘗試將新文件添加到程式碼庫中。我正在嘗試通過添加以下行在 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 文件添加到公共庫中,但也沒有成功。我重新安排了 Makefile.am 的 EXTRA_LIBRARIES 部分,但沒有運氣。


為了簡化問題,這裡有一個非常簡單的例子,它會吐出同樣的錯誤:

將 1 個 .h 和 1 個 .cpp 文件添加到 1 個已創建的庫:libbitcoin_common 新文件:src/testFile.cpp src/testFile.h

測試文件.h:

void testFunction();

測試文件.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 在哪裡,正如 Pieter Wuille在這裡提到的

# 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_LDADDMakefile.am. 這樣連結器就知道要連結它。對於連結器,依賴項需要放在依賴它的事物之後。因此,您只需添加$(LIBGLYPH)到該列表的末尾即可。

程式碼有兩個問題:

  1. 如果 C 程式碼的標頭檔中沒有 extern “C”,則無法使用 C++ 編譯器編譯 C 程式碼。<https://stackoverflow.com/questions/12066279/using-c-libraries-for-c-programs>
  2. 編譯 C 程式碼時可能必須使用 -fPIC(將其添加到標誌中)。我使用了 liblibraryName_a_CFLAGS = -fPIC 和 liblibraryName_a_CXXFLAGS = -fPIC

對於想要查看我的 makefile.am 的任何人,請訪問此處:https ://drive.google.com/file/d/1eB_EnxfSG1erRgDpDNgU_q-PzPQYs0hp/view?usp=sharing

建構系統是出了名的令人沮喪。如果您有任何疑問,請發表評論或問我。

引用自:https://bitcoin.stackexchange.com/questions/67809