使用自动工具的未定义引用

Undefined references with using autotools

本文关键字:未定义 引用 工具      更新时间:2023-10-16

我如今正在努力解决这些不确定的参考,我在下面通过在我的机器上使用autotools所描述的。

我不确定我有未定义的裁判的原因是什么,但是我怀疑与自动工具有关,也许C 17与自动工具没有完全集成,我的设置不好或...想法。

我检查了语法数万亿次,将模板定义仅移至标题,将参数计数更改为功能,重新排列的makefiles ..等。仍然没有。

也许您可以帮助我?


configure.ac

AC_INIT([CRYPTO], [0.1], [iamhidingmymail@gmail.com])
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&)'

while loga.cpp:7是:

loga::loga(std::string filename){
        Logger = std::move(fsio::file(filename));//line 7
    }

logger 定义为:

::fsio::file Logger;

在fsio.h


但是, file 构造函数和操作员=的定义可以在

下找到
//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!"

fyi

 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

分支:logger

谢谢!

for ur1 i dod define header 文件中的模板函数 file,以前声明了模板功能在标题中,但在源中定义。做技巧

对于 ur2 i 包括定义了这些功能的静态库,并在相应的 makefile libadd 使用_ libadd 指令/strong>。编译器不知道在哪里可以找到这些功能的符号。现在知道:)