将多个cpp文件一起编译(包括相同的头文件)会导致对所有内容的未定义引用

时间:2017-05-18 11:33:07

标签: c++ gcc

自从重组我的c ++项目以来,我一直在努力奋斗。它一直在工作,它仍然是一个单独的文件,包括其中的每一部分(字面上正好在文件中,甚至不包括#include,除了io的东西)。它编译得很好,但现在:

我为每个类都有单个文件,因为如果将它们全部压缩在一起会花费几秒钟,这对于我对代码进行的通常相当小的更改来说有点太长了。 这到目前为止工作得很好,我做了适当的Makefile(我使用gcc并通过命令行制作,没有ides,在Windows上的msys2上)并且编译没有发出代码错误,除了它确实找不到的问题单个引用我的函数或其他任何东西,比如std :: stuff。

在试图找出它的来源时,我重新构建了更小的代码结构。只有2个cpp文件,每个文件都包含一个函数签名的函数定义,该函数签名通过一个简短的.h文件包含在内。 (例如func.cpp:1 #include"func.h"。test.cpp还包含'main'函数。我将把整个代码追加到这个帖子的下面) 这两个文件只包含一个函数(main除外,但这不是重点),它们只是简单stdout内容的包装器。为了使这些工作(编译没有代码语法错误),我必须在相应的cpp文件中包含适当的std头。所以func.cpp和test.cpp分别包含func.h和test.h,两个包括iostream。 现在,当我尝试编译它时,我在我的大项目中得到了相同的未定义引用错误(尽管这里的内容少了很多)

C:\msys64\tmp\cc0oLmKB.o:func.cpp:(.text+0x17): undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' C:\msys64\tmp\cc0oLmKB.o:func.cpp:(.text+0x26): undefined reference to 'std::ostream::operator<<(std::ostream& (*)(std::ostream&))' C:\msys64\tmp\cc0oLmKB.o:func.cpp:(.text+0x46): undefined reference to 'std::ios_base::Init::~Init()' (这还有大约六个功能。)

这显然是cpp代码的问题,因为如果我用c的stdio / printf替换c ++ - iostream的东西(在两个文件中,所以2xiostream =&gt; 2xstdio),它工作正常,但我绝对没有idead如何修复它。我已经将iostream包装在一个ifndef块中,这样它就不会被包含得更频繁了(这没有任何意义,因为没有cpp文件包含另一个,但我很绝望!),但那样做不改变一件事。 (之前,我将两者编译成相应的.o文件,并通过gcc func.o test.o -o main链接它们,从中我得到了相同的结果,许多未定义的引用)。

我完全不知道现在该做什么。我唯一的想法是,它可能是msys2的gcc / std-libs版本的问题,所以我将在linux机器上尝试相同的代码片段并告诉你它是否有效,但它可能不会。

期待你的回答, 帕特里克

我不知道为什么这会被标记为重复。现有的线程不回答我的问题。正如我所说,它适用于c头文件,但不适用于c ++文件。这可能是一个链接错误,但我还没有看到如何解决这个问题的解释。

扩展信息:

func.h:

int myprint();

test.h:

void stuff();

func.cpp:

#include"func.h"

#ifndef IO
#define IO
#include<iostream>
#endif

//if the iostream stuff is replaced with stdio.h and std::cout etc. replaced with printf, it works

int myprint(){
    std::cout<<"hello"<<std::endl;

}

TEST.CPP:

#include"func.h"
#include"test.h"

#ifndef IO
#define IO
#include<iostream>
#endif

void stuff(){
    std::cout<<"stuff"<<std::endl;
}

int main(int argc, char **argv){

    myprint();
    stuff();

    return 0;
}

编译命令:(添加任何std也没有帮助,只是你知道)

gcc -o main func.cpp test.cpp

编译器输出:

C:\msys64\tmp\ccY7n59u.o:func.cpp:(.text+0x17): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
C:\msys64\tmp\ccY7n59u.o:func.cpp:(.text+0x26): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
C:\msys64\tmp\ccY7n59u.o:func.cpp:(.text+0x41): undefined reference to `std::ios_base::Init::~Init()'
C:\msys64\tmp\ccY7n59u.o:func.cpp:(.text+0x71): undefined reference to `std::ios_base::Init::Init()'
C:\msys64\tmp\ccY7n59u.o:func.cpp:(.rdata$.refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_[.refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_]+0x0): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
C:\msys64\tmp\ccY7n59u.o:func.cpp:(.rdata$.refptr._ZSt4cout[.refptr._ZSt4cout]+0x0): undefined reference to `std::cout'
C:\msys64\tmp\ccSaa3Ax.o:test.cpp:(.text+0x17): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
C:\msys64\tmp\ccSaa3Ax.o:test.cpp:(.text+0x26): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
C:\msys64\tmp\ccSaa3Ax.o:test.cpp:(.text+0x6a): undefined reference to `std::ios_base::Init::~Init()'
C:\msys64\tmp\ccSaa3Ax.o:test.cpp:(.text+0x9a): undefined reference to `std::ios_base::Init::Init()'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:2: main] Error 1

gcc -v:

Using built-in specs.
COLLECT_GCC=C:\msys64\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/6.3.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-6.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev3, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
Thread model: posix
gcc version 6.3.0 (Rev3, Built by MSYS2 project)

0 个答案:

没有答案