Windows 下64位TDM-GCC-64 g++自定义库的生成及使用

时光毁灭记忆、已成空白 提交于 2019-12-03 08:40:02

一、自定义库的生成

生成szlib.o文件:

$ g++ -c szlib.cpp

生成libszlib.a文件:

$ ar crv libszlib.a szlib.o
a - szlib.o

查看库文件中的函数:

$ nm lib\*.a

szlib.o:
0000000000000000 b .bss
0000000000000000 d .ctors
0000000000000000 d .data
0000000000000000 p .pdata
0000000000000000 r .rdata
0000000000000000 r .rdata$zzz
0000000000000000 t .text
0000000000000000 r .xdata
                 U __mingw_vprintf
00000000000004ad t __tcf_0
0000000000000504 t _GLOBAL__sub_I__Z15StopWatch_startv
00000000000000a8 T _Z10SZSW_startv
00000000000001ce T _Z11PrintfArrayPii
0000000000000379 T _Z11sort_bubblePiib
000000000000022d T _Z12FillArrayRndPii
0000000000000061 T _Z14StopWatch_stopv
0000000000000041 T _Z15StopWatch_startv
00000000000004c8 t _Z41__static_initialization_and_destruction_0ii
0000000000000106 T _Z4swapRiS_
000000000000013b T _Z5swap2PiS_
0000000000000170 T _Z7verinfoPKcS0_
000000000000028c T _Z8sort_selPii
00000000000000c2 T _Z9SZSW_stopv
0000000000000010 b _ZL10szsw_start
0000000000000008 b _ZL23StopWatch_seconds_start
0000000000000000 t _ZL6printfPKcz
                 U _ZNSt8ios_base4InitC1Ev
                 U _ZNSt8ios_base4InitD1Ev
0000000000000000 b _ZStL8__ioinit
                 U atexit
                 U clock
                 U difftime
                 U rand
                 U srand
                 U time

 

二、自定义库文件的使用方法一:直接使用库文件的路径及全名:

$ gcc  -o p204-5 p204-5.cpp ./lib/libszlib.a -lstdc++

三、自定义库文件的使用方法二:使用-L -l选项

p204-5.cpp中要使用库libszlib.a,通过头文件szlib.h

编译问题:找不到自定义库中的函数

D:\exp
$ gcc -L./lib -lszlib -o p204-5 p204-5.cpp
C:\Users\ADMINI~1\AppData\Local\Temp\ccpVKqoM.o:p204-5.cpp:(.text+0x71d): undefined reference to `verinfo(char const*, char const*)'
C:\Users\ADMINI~1\AppData\Local\Temp\ccpVKqoM.o:p204-5.cpp:(.text+0x722): undefined reference to `SZSW_start()'
C:\Users\ADMINI~1\AppData\Local\Temp\ccpVKqoM.o:p204-5.cpp:(.text+0x74a): undefined reference to `SZSW_stop()'
C:\Users\ADMINI~1\AppData\Local\Temp\ccpVKqoM.o:p204-5.cpp:(.text+0x793): undefined reference to `std::ios_base::Init::~Init()'
C:\Users\ADMINI~1\AppData\Local\Temp\ccpVKqoM.o:p204-5.cpp:(.text+0x7c3): undefined reference to `std::ios_base::Init::Init()'
collect2.exe: error: ld returned 1 exit status

原因是:

gcc 依赖顺序问题

这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。

在gcc编译的时候,如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。

例如:在main.c中使用了pthread库相关函数,那么编译的时候必须是main.c在前,-lpthread在后。gcc main.c -lpthread -o a.out。

上面出现问题的原因就是引入库的顺序在前面了,将其放置在后面即可了。

解决方法:

$ gcc  -o p204-5 p204-5.cpp -L./lib -lszlib

问题: undefined reference to `std::ios_base::Init::Init()


D:\exp
$ gcc  -o p204-5 p204-5.cpp -L./lib -lszlib
C:\Users\ADMINI~1\AppData\Local\Temp\cc93nev7.o:p204-5.cpp:(.text+0x793): undefined reference to `std::ios_base::Init::~Init()'
C:\Users\ADMINI~1\AppData\Local\Temp\cc93nev7.o:p204-5.cpp:(.text+0x7c3): undefined reference to `std::ios_base::Init::Init()'
./lib/libszlib.a(szlib.o):szlib.cpp:(.text+0x4bd): undefined reference to `std::ios_base::Init::~Init()'
./lib/libszlib.a(szlib.o):szlib.cpp:(.text+0x4ed): undefined reference to `std::ios_base::Init::Init()'
collect2.exe: error: ld returned 1 exit status

 解决方法:


D:\exp
$ gcc  -o p204-5 p204-5.cpp -L./lib -lszlib -lstdc++

 

 

环境:Windows 2016 cmd

$ ver

Microsoft Windows [版本 10.0.14393]

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=P:/TDM-GCC-64/bin/../libexec/gcc/x86_64-w64-mingw32/5.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-5.1.0/configure --build=x86_64-w64-mingw32 --enable-targets=all --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-graphite --enable-cxx-flags=-DWINPTHREAD_STATIC --disable-build-with-cxx --disable-build-poststage1-with-cxx --enable-libstdcxx-debug --enable-threads=posix --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable-libstdcxx-time --with-gnu-ld --disable-werror --disable-nls --disable-win32-registry --prefix=/mingw64tdm --with-local-prefix=/mingw64tdm --with-pkgversion=tdm64-1 --with-bugurl=http://tdm-gcc.tdragon.net/bugs
Thread model: posix
gcc version 5.1.0 (tdm64-1)

 

 

 

参考:

undefined reference to `std::ios_base::Init::Init()

https://blog.csdn.net/kittaaron/article/details/8101391

 

2012年10月23日 09:31:01 kittaaron 阅读数:4147
 

用gcc(C编译器)编译C++程序,会报标题的错误。

原因是用gcc编译c++程序时,链接的库文件为libstdc++.so,而不是默认的libc.so,因此需要用-lstdc++参数指明,否则会在链接时发生错误.

如: gcc helloworld.cpp -lstdc++


gcc编译时对'xxxx'未定义的引用问题

http://www.linuxdiyf.com/linux/16754.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!