การอ้างอิงที่ไม่ได้กำหนดโดยใช้เครื่องมืออัตโนมัติ

ทุกวันนี้ ฉันกำลังประสบปัญหาในการแก้ไข ข้อมูลอ้างอิงที่ไม่ได้กำหนด ซึ่งฉันได้อธิบายไว้ด้านล่างโดยใช้เครื่องมืออัตโนมัติบนเครื่องของฉัน

ฉันไม่แน่ใจว่าอะไรคือเหตุผลว่าทำไมฉันถึงมีการอ้างอิงที่ไม่ได้กำหนด แต่ฉันสงสัยว่ามีบางอย่างที่เกี่ยวข้องกับเครื่องมืออัตโนมัติ บางที 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

สาขา: คนตัดไม้

ขอบคุณ!


person Nikola Lozanovski    schedule 27.11.2017    source แหล่งที่มา


คำตอบ (1)


สำหรับ UR1 ฉันได้ กำหนด ฟังก์ชันเทมเพลตภายในไฟล์ ส่วนหัว ก่อนหน้านี้ฟังก์ชันเทมเพลตได้รับการประกาศในส่วนหัวแต่กำหนดไว้ในแหล่งที่มา นั่นทำเคล็ดลับ

สำหรับ UR2 ฉัน รวม ไลบรารีแบบคงที่ซึ่งมีการกำหนดฟังก์ชันเหล่านั้น โดยใช้คำสั่ง _LIBADD ใน makefile ที่เกี่ยวข้อง . คอมไพเลอร์ไม่รู้ว่าจะหาสัญลักษณ์เหล่านั้นสำหรับฟังก์ชันได้ที่ไหน ตอนนี้มันรู้แล้ว :)

person Nikola Lozanovski    schedule 28.11.2017