我正在尝试在ubuntu中编译以下代码
#include <unordered_map.h>
typedef unsigned int key_type; // fine, has < , ==, and std::hash
typedef std::map<key_type, some_value_type> my_map;
使用此命令
g++ -Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient -I/usr/include/mysql -DBIG_JOINS=1 -fno-strict-aliasing -DUNIV_LINUX -DUNIV_LINUX -I/usr/include/ -I/usr/include/c++/4.5/bits/ main.c -o program
我得到了这个错误
1234@(none:/usr/local/src/testing$ make
g++ -Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient -I/usr/include/mysql -DBIG_JOINS=1 -fno-strict-aliasing -DUNIV_LINUX -DUNIV_LINUX -I/usr/include/ -I/usr/include/c++/4.5/bits/ main.c -o program
In file included from main.c:5:0:
/usr/include/c++/4.5/bits/unordered_map.h:33:32: error: expected constructor, destructor, or type conversion before ‘(’ token
make: *** [all] Error 1
这是map.h的定位
1234 @(none):/ usr / local / src / testing $ locate map.h
的/ usr /包括/ C ++ / 4.5 /比特/ stl_map.h
的/ usr /包括/ C ++ / 4.5 /比特/ stl_multimap.h
的/ usr /包括/ C ++ / 4.5 /比特/ unordered_map.h
的/ usr /包括/ C ++ / 4.5 /调试/ map.h
的/ usr /包括/ C ++ / 4.5 /调试/ multimap.h
的/ usr /包括/ C ++ / 4.5 /简档/ map.h
的/ usr /包括/ C ++ / 4.5 /简档/ multimap.h
的/ usr /包括/ C ++ / 4.5 /简档/ IMPL / profiler_map_to_unordered_map.h
的/ usr /包括/ C ++ / 4.5 / TR1 / unordered_map.h
此外我还有其他的mysql,我将使用,但主要只是返回0;
答案 0 :(得分:2)
如果您没有完全搞乱编译器设置,则不需要传递那么多选项。您可以删除-I/usr/include/ -I/usr/include/c++/4.5/bits/
。
g++ -Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient \
-I/usr/include/mysql -DBIG_JOINS=1 -fno-strict-aliasing \
-DUNIV_LINUX -DUNIV_LINUX main.c -o program
此外,由于您调整了包含路径,因此您可以看到不应直接包含的实现文件unordered_map.h
。而是包括
#include <unordered_map>
// for C++0x
或
#include <tr1/unordered_map>
// for C++98
通常,C ++的“标准库”标题名称中没有.h
。 C库头文件具有它(例如math.h
),但是您提供了一个附加版本,其声明在标准命名空间中正确包装。这些标头以c
开头,例如cmath
。
答案 1 :(得分:1)
使用std::unordered_map
和标准标题<unordered_map>
或使用std::map
和标准标题<map>
。不要混淆两者。
答案 2 :(得分:0)
您永远不必将-I
放入g ++ bits
目录,而只需直接包含目录。这让我相信你正在使用一个与你的编译器不兼容的库。
另一个选择是map
包含之前的代码被破坏,例如{
}
不匹配。