2015-03-30 5 views
0

Я использовал OSX для программирования на C++, но я новичок в компиляторе C++ в Linux. У меня есть программа, состоящая из двух файлов .cpp и одного файла .h, которые скомпилированы и успешно запущены на моем Mac, но получайте компиляцию ошибок на Ubuntu. Я установил gcc и g ++-компиляторы и build-essential, а также apt-get update и update, поиск в Интернете, но не напрасно. У моего Ubuntu нет некоторых пакетов библиотек или какая-то дополнительная конфигурация, необходимая для устранения проблемы?Невозможно скомпилировать C++-программу на Ubuntu

Вот ошибки Компиляция моей программы на Ubuntu:

WordCombine.cpp: In function ‘int BuildTrie(const string&, Trie*&, std::vector<std::basic_string<char> >&)’: 
WordCombine.cpp:21:37: error: no matching function for call to ‘std::basic_ifstream<char>::basic_ifstream(const string&, const openmode&)’ 
    ifstream ifs(filename, ifstream::in); 
            ^
WordCombine.cpp:21:37: note: candidates are: 
In file included from WordCombine.cpp:10:0: 
/usr/include/c++/4.8/fstream:467:7: note: std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode] 
     basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in) 
    ^
/usr/include/c++/4.8/fstream:467:7: note: no known conversion for argument 1 from ‘const string {aka const std::basic_string<char>}’ to ‘const char*’ 
/usr/include/c++/4.8/fstream:453:7: note: std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char; _Traits = std::char_traits<char>] 
     basic_ifstream() : __istream_type(), _M_filebuf() 
    ^
/usr/include/c++/4.8/fstream:453:7: note: candidate expects 0 arguments, 2 provided 
/usr/include/c++/4.8/fstream:427:11: note: std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&) 
    class basic_ifstream : public basic_istream<_CharT, _Traits> 
     ^
/usr/include/c++/4.8/fstream:427:11: note: candidate expects 1 argument, 2 provided 

Вот мой г ++ -v Информация:

Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --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-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-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 --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 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 
+2

Как насчет отображения строк * исходного кода *, которые вызывают ошибки? Тем не менее, «неизвестное преобразование для аргумента 1 из« const string {aka const std :: basic_string } »в« const char * »означает, что вам не нужен конструктор C++ 11, который принимает имя файла как' std :: string' (в C++ 03 вам нужно предоставить 'const char *') - попробуйте добавить '-std = C++ 11' в вашу командную строку компилятора. –

ответ

1

Вы пытаетесь использовать std::basic_ifstream<char>::basic_ifstream(const string&, const openmode&) конструктор, и в соответствии с this, это дополнение C++ 11.

Возможно, вам понадобится добавить -std=c++11 в свою командную строку, так как это не значение по умолчанию.

+1

Если вы не хотите использовать C++ 11 (но я думаю, что вы хотите, поскольку ваш Mac-компилятор, по-видимому, использовал C++ 11 по умолчанию), вы можете просто преобразовать строку 'std :: string' в 'const char *': 'ifstream ifs (filename.c_str(), ifstream :: in)'. – gurka

+0

И наоборот, вы можете установить clang на Linux тоже, и использовать тот же компилятор на обеих платформах. Это, по крайней мере, уменьшит количество причуд, которые вам нужно запомнить. – Useless

Смежные вопросы