下了一些百度webapi代码,定义声明都在.h文件中,没有.cpp文件。
我的代码是.h .cpp分开的,当我包含那些.h后,编译就报错一堆重复定义
下载连接地址:百度在线语音识别下载链接
——————————————————————————————
好像图片显示不了,粘贴一段异常
g++ main.cpp RecogBaiduOnline.cpp -L. -ljsoncpp -lcrypto -lcurl -g -o main -std=c++11
/tmp/ccVleVa4.o:在函数‘void std::_Destroy_aux<false>::__destroy<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)’中:
/home/dyan/projects/recognition_sound/base/base64.h:35: `aip::base64_encode[abi:cxx11](char const*, unsigned int)'被多次定义
/tmp/cchpsjly.o:/home/dyan/projects/recognition_sound/base/base64.h:35:第一次在此定义
/tmp/ccVleVa4.o:在函数‘void std::__adjust_heap<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, __gnu_cxx::__ops::_Iter_less_iter>(__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, long, long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, __gnu_cxx::__ops::_Iter_less_iter)’中:
/home/dyan/projects/recognition_sound/base/base64.h:88: `aip::base64_decode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'被多次定义
/tmp/cchpsjly.o:/home/dyan/projects/recognition_sound/base/base64.h:88:第一次在此定义
/tmp/ccVleVa4.o:在函数‘aip::utc_time[abi:cxx11](long)’中:
/home/dyan/projects/recognition_sound/base/utils.h:79: `aip::utc_time[abi:cxx11](long)'被多次定义
/tmp/cchpsjly.o:/home/dyan/projects/recognition_sound/base/utils.h:79:第一次在此定义
—————————————————————————
把源码中重复定义的函数都加了static inline,只保留了第一个重复定义函数没有加inline用来显示错误,加了g++ -v参数,完整编译信息
g++ main.cpp RecogBaiduOnline.cpp -L. -ljsoncpp -lcrypto -lcurl -g -v -o main -std=c++11
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.9' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
COLLECT_GCC_OPTIONS='-L.' '-g' '-v' '-o' 'main' '-std=c++11' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/5/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE main.cpp -quiet -dumpbase main.cpp -mtune=generic -march=x86-64 -auxbase main -g -std=c++11 -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/ccQmpXV5.s
GNU C++11 (Ubuntu 5.4.0-6ubuntu1~16.04.9) version 5.4.0 20160609 (x86_64-linux-gnu)
compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/5"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/include/c++/5
/usr/include/x86_64-linux-gnu/c++/5
/usr/include/c++/5/backward
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
GNU C++11 (Ubuntu 5.4.0-6ubuntu1~16.04.9) version 5.4.0 20160609 (x86_64-linux-gnu)
compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: d8217bc73be730fa402b500d5726a5b4
COLLECT_GCC_OPTIONS='-L.' '-g' '-v' '-o' 'main' '-std=c++11' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
as -v --64 -o /tmp/ccPnErzo.o /tmp/ccQmpXV5.s
GNU汇编版本 2.26.1 (x86_64-linux-gnu) 使用BFD版本 (GNU Binutils for Ubuntu) 2.26.1
COLLECT_GCC_OPTIONS='-L.' '-g' '-v' '-o' 'main' '-std=c++11' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/5/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE RecogBaiduOnline.cpp -quiet -dumpbase RecogBaiduOnline.cpp -mtune=generic -march=x86-64 -auxbase RecogBaiduOnline -g -std=c++11 -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/ccQmpXV5.s
GNU C++11 (Ubuntu 5.4.0-6ubuntu1~16.04.9) version 5.4.0 20160609 (x86_64-linux-gnu)
compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/5"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/include/c++/5
/usr/include/x86_64-linux-gnu/c++/5
/usr/include/c++/5/backward
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
GNU C++11 (Ubuntu 5.4.0-6ubuntu1~16.04.9) version 5.4.0 20160609 (x86_64-linux-gnu)
compiled by GNU C version 5.4.0 20160609, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: d8217bc73be730fa402b500d5726a5b4
COLLECT_GCC_OPTIONS='-L.' '-g' '-v' '-o' 'main' '-std=c++11' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
as -v --64 -o /tmp/ccCqvBxL.o /tmp/ccQmpXV5.s
GNU汇编版本 2.26.1 (x86_64-linux-gnu) 使用BFD版本 (GNU Binutils for Ubuntu) 2.26.1
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-L.' '-g' '-v' '-o' 'main' '-std=c++11' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccPnBSQ8.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o main /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L. -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. /tmp/ccPnErzo.o /tmp/ccCqvBxL.o -ljsoncpp -lcrypto -lcurl -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o
/tmp/ccCqvBxL.o:在函数‘__gnu_cxx::new_allocator<ASR_result*>::new_allocator()’中:
/home/dyan/projects/recognition_sound/base/base64.h:35: `aip::base64_encode[abi:cxx11](char const*, unsigned int)'被多次定义
/tmp/ccPnErzo.o:/home/dyan/projects/recognition_sound/base/base64.h:35:第一次在此定义
collect2: error: ld returned 1 exit status
makefile:9: recipe for target 'main' failed
make: *** [main] Error 1
——————————————————————————————
然后看了下代码,有预编译,不是重复包含的问题。只看前2个报的重复定义35行和88行
之后我也把自己的声明和定义都写到.h文件中并include百度的.h,没有了.cpp文件,异常就消失了。
问题:
1.这样做就让我之后include的.h文件中只要有include百度的.h就全部要做成这样吗?这很不现实啊。
2.这种异常是如何产生的?
3.如何解决?
使用你提供的 SDK 下载链接,亲测可编译(linux x64 g++)。
源码目录结构如下
文件 a.h 内容如下
文件 a.cpp 内容如下
文件 main.cpp 内容如下
文件 Makefile 内容如下
使用命令
make
顺利编译。由于你没有贴出调用 SDK 的相关代码,我无法准确判断原因。
以上面的代码结构为例,你很可能在 a.h 里引用了 SDK 的头文件,然后在 a.cpp 里面引用了 a.h 头文件,类似这样
这种写法就会出现 “重复定义” 的错误,。
SDK 下载地址: http://ai.baidu.com/download?...