ทุกวันนี้ ฉันกำลังประสบปัญหาในการแก้ไข ข้อมูลอ้างอิงที่ไม่ได้กำหนด ซึ่งฉันได้อธิบายไว้ด้านล่างโดยใช้เครื่องมืออัตโนมัติบนเครื่องของฉัน
ฉันไม่แน่ใจว่าอะไรคือเหตุผลว่าทำไมฉันถึงมีการอ้างอิงที่ไม่ได้กำหนด แต่ฉันสงสัยว่ามีบางอย่างที่เกี่ยวข้องกับเครื่องมืออัตโนมัติ บางที c++17 อาจไม่ได้รวมเข้ากับเครื่องมืออัตโนมัติอย่างสมบูรณ์ การตั้งค่าของฉันไม่ดี หรือ... ฉันไม่มีความคิดเลย
ฉันตรวจสอบไวยากรณ์ล้านล้านครั้ง ย้ายคำจำกัดความเทมเพลตไปที่ส่วนหัวเท่านั้น เปลี่ยนการนับพารามิเตอร์เป็นฟังก์ชัน จัดเรียง Makefiles ใหม่ .. ฯลฯ ยังคงไม่มีอะไรเลย
บางทีคุณอาจช่วยฉันได้?
กำหนดค่า ac
AC_INIT([CRYPTO], [0.1], [[email protected]])
AM_INIT_AUTOMAKE
AC_PROG_RANLIB
AC_PROG_CXX
AC_LANG(C++)
AX_CHECK_COMPILE_FLAG([-std=c++17], [
CXXFLAGS="$CXXFLAGS -std=c++17"])
AC_CONFIG_FILES([ fsio/Makefile logger/Makefile rsa/Makefile primes/Makefile Makefile])
AC_OUTPUT
topdir -> Makefile.am
AUTOMAKE_OPTIONS = foreign
SUBDIRS = logger fsio primes rsa
AM_CPPFLAGS = -I$(top_srcdir) -Wall -std=c++17
bin_PROGRAMS = crypto.out
crypto_out_SOURCES = bigInt.cpp Source.cpp
crypto_out_LDADD = -lpthread fsio/libFsio.a logger/libLogger.a rsa/libRSA.a primes/libPrimes.a
fsio/Makefile.am
noinst_LIBRARIES = libFsio.a
libFsio_a_SOURCES = fsio.cpp
libFsio_a_CPPFLAGS = -I$(top_srcdir) -Wall -std=c++17
Logger/Makefile.am
noinst_LIBRARIES = libLogger.a
libLogger_a_SOURCES = loga.cpp
libLogger_a_CPPFLAGS = -I$(top_srcdir) -Wall -std=c++17
การอ้างอิงที่ไม่ได้กำหนด 1:
Source.cpp:17: undefined reference to `void logger::loga::I<char const*, char const*, char const*>(char const*, char const*, char const*)'
ในขณะที่ Source.cpp:17 คือ:
logger::loga l("testlog.log");
l.I("Test", "test ","!");//line 17
และกำหนดเป็น:
template<typename ...message>
void loga::I(message ...m){
//(this is fold expression)
//code
}
การอ้างอิงที่ไม่ได้กำหนด 2:
logger/libLogger.a(libLogger_a-loga.o): In function `logger::loga::loga(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
<path>/logger/loga.cpp:7: undefined reference to `fsio::file::file(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::_Ios_Openmode)'
<path>/logger/loga.cpp:7: undefined reference to `fsio::file::operator=(fsio::file const&)'
ในขณะที่ loga.cpp:7 คือ:
loga::loga(std::string filename){
Logger = std::move(fsio::file(filename));//line 7
}
และ Logger ถูกกำหนดเป็น:
::fsio::file Logger;
ใน fsio.h
อย่างไรก็ตาม คุณสามารถดูคำจำกัดความของตัวสร้าง ไฟล์ และตัวดำเนินการ= ได้ที่ด้านล่าง
//in header file constructor is declared as
(std::string& filename, std::fstream::openmode it =
(std::ios::app|std::ios::out|std::ios::in));
file::file(std::string& filename , std::ios_base::openmode om ){
//code
//code
}
file& file::operator=(const file& f){
//code
return *this;
}
ไบนารีถูกคอมไพล์ด้วย:
g++ -g -O2 -std=c++17 -o crypto.out bigInt.o Source.o -lpthread fsio/libFsio.a logger/libLogger.a rsa/libRSA.a primes/libPrimes.a
ฉันสร้างสคริปต์แบบกำหนดเองสำหรับการรันการกำหนดค่า สร้าง ฯลฯ และมันคือ:
./สร้าง
#!/bin/bash
set -e
aclocal
autoconf
automake --add-missing
./configure
echo
make -j4
echo "building done, running application:"
./crypto.out
echo "done!"
ขอแจ้งให้ทราบ
Ubuntu 17.10
uname -a
Linux nikola 4.13.0-041300-generic #201709031731 SMP Sun Sep 3 21:33:09 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
automake --version
automake (GNU automake) 1.15
g++ -v
gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3)
หากคุณรู้สึกว่าโค้ดสั้น โปรดไปที่ GitHub ของฉัน
https://github.com/NikolaLozanovski/crypto/tree/logger
สาขา: คนตัดไม้
ขอบคุณ!