我正在尝试在遗留C ++项目中构建一个库。平台是使用gcc编译器的power-pc。
编译器提供类似于此的构建错误:错误:字符串:没有这样的文件或目录或错误:vector:没有这样的文件或目录。
我的理解是它无法找到标准库。标准库文件通常驻留在哪里,格式是什么?是* .h还是其他?我在互联网上搜索过这个,但我认为我并不完全理解它。
令人困惑的部分是使用相同源代码文件的同一项目中的另一个库完全构建正常。这对我来说可能是这两个项目的makefile是不同的,其中一个是能够找到std lib,另一个则不是。但是快速比较两者并没有带来任何明显的差异。还有其他想法吗?
最后,我刚刚了解到string.h是针对c风格的字符串,而string是针对C ++ std lib的。可以混合它们,即源文件有#include string.h,还有#include字符串通过包含一些其他文件隐式地?我问,因为这与未构建的文件中的情况相同。
感谢。
错误讯息:
编译SOURCE_FILE.cpp
SOURCE_FILE.cpp中包含的文件:3:
HDR_FILE.h:1:错误:字符串:没有这样的文件或目录
HDR_FILE.h:2:错误:vector:没有这样的文件或目录
CODE IN SOURCE_FILE.cpp
#include <stdlib.h>
#include <string.h>
#include "fileABC.h"
using namespace std;
// Other code
HRD_FILE.h中的代码
#include <string>
#include <vector>
#include <hdr.h>
#include <hdr-cseq.h>
//... OTHER FILES ETC.
答案 0 :(得分:5)
如果文件未被检测为C ++源代码,则可能会出现这样的错误。是否使用适当的文件扩展名命名了c ++文件?
cat test.c
#include <vector>
int main() {}
gcc test.c
test.c:1:18: error: vector: No such file or directory
上面的命令将编译C代码,但不编译C ++。请记住,这是两种不同的语言。要构建C ++程序,您必须告诉编译器源是C ++这样或那样的。如果你使用g ++,它会自动假设带有&#39; .c&#39;扩展是C ++(至少我的版本。或者您可以通过在传递文件之前传递-x c++
来告诉编译器使用C ++。您还必须告诉链接器包含C ++库.g ++自动执行此操作同样,或者您可以传递链接器标志-lstdc++
。
艰难的道路:
gcc -x c ++ test.c -lstdc ++
简单方法:
g ++ test.c
在回答您的上一个问题时,您可以自由地混合<string.h>
和<string>
(尽管您应该使用<cstring>
代替<string.h>
)。
答案 1 :(得分:1)
C语言字符串与C ++ std :: string。
不同 C语言字符串类型是由nul,0,'\ 0'字符终止的字符序列。管理此数据结构的函数声明位于<string.h> or <cstring>
,具体取决于您是分别编译为C还是C ++。
C ++ std :: string类型是一个字符容器。实际的实现可能因编译器而异,但接口不会。 std :: string的方法在<string>.
中声明必须设置编译器以便用C ++语言进行编译。
C ++ std :: string包含用于生成C语言字符串以及用于从C语言样式字符串创建C ++字符串的方法。阅读标准模板库以获取更多信息。
此外,在Web上搜索“C ++ FAQ”。在使用C ++语言编程之前,这是必读的。还有一个C语言的常见问题解答。