向 Makefile.am 添加新文件
通過將文件添加到自動工具建構系統中,我需要一些幫助來將文件添加到程式碼庫中。其他試圖回答相同問題的文章對我沒有幫助。我正在試驗比特幣的程式碼庫,我正在嘗試將新文件添加到程式碼庫中。我正在嘗試通過添加以下行在 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_LDADD
到Makefile.am
. 這樣連結器就知道要連結它。對於連結器,依賴項需要放在依賴它的事物之後。因此,您只需添加$(LIBGLYPH)
到該列表的末尾即可。
程式碼有兩個問題:
- 如果 C 程式碼的標頭檔中沒有 extern “C”,則無法使用 C++ 編譯器編譯 C 程式碼。<https://stackoverflow.com/questions/12066279/using-c-libraries-for-c-programs>
- 編譯 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
建構系統是出了名的令人沮喪。如果您有任何疑問,請發表評論或問我。