我正在尝试编译一个负载的 .c 文件。
(1)文件编译正常,使用cc
cc -Wall -Wextra -Wunreachable-code -ggdb -O0 *.c
(2)然后,我需要从最终输出中创建一个静态库,用于C++程序。所以我做了:
ar cru liborientdb-c.a *.o
(3)它工作正常。然而,当我开始编译包含第1行中的库的C++程序 testme.cpp 时,
(line 1 of testme.cpp)
#include "liborientdb-c.a"
编译步骤:
cc testme.cpp
我得到这个错误:
liborientdb-c.a:117:22: error: stray '\3' in program
liborientdb-c.a:117:263: warning: null character(s) ignored [enabled by default]
liborientdb-c.a:117:22: error: stray '\17' in program
liborientdb-c.a:117:265: warning: null character(s) ignored [enabled by default]
liborientdb-c.a:117:283: warning: null character(s) ignored [enabled by default]
liborientdb-c.a:117:22: error: stray '\22' in program
liborientdb-c.a:117:287: warning: null character(s) ignored [enabled by default]
liborientdb-c.a:117:22: error: stray '\1' in program
liborientdb-c.a:117:289: warning: null character(s) ignored [enabled by default]
liborientdb-c.a:117:22: error: stray '\362' in program
....
所以,根据其他一些帖子here的建议,我相信错误可能是由于编码混乱。
所以我使用了“od -c”和来尝试跟踪“八进制流”被搞砸的地方。我的一个.o文件在使用'od -c'后的输出看起来很糟糕,所以我认为这可能是原因。
比如说,
0000000 177 E L F 002 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 001 \0 > \0 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000040 \0 \0 \0 \0 \0 \0 \0 \0 ` ( \0 \0 \0 \0 \0 \0
0000060 \0 \0 \0 \0 @ \0 \0 \0 \0 \0 @ \0 026 \0 023 \0
0000100 U H 211 ? H 203 ? 020 H 211 } ? H 211 u ?
0000120 H 213 E ? H 213 \0 H 213 @ \b H 205 ? t 023
0000140 H 213 E ? H 213 \0 H 213 @ \b H 211 ? ? \0
我该怎么解决这个问题呢?我实际上遵循了建议here,并在我的库源文件上运行了这个:
recode UTF8..ISO-8859-15 *.c
回复是文件保持不变(最后修改日期仍然是旧的)。然后我打开我的.c文件,看到它们是UTF-8格式的,这显然是ASCII的一个子集。所以这似乎不是一个问题。
但是.o文件看起来还是很奇怪。
我该怎么办?
2条答案
按热度按时间oxf4rvwz1#
请看:
.a文件不是C源文件。甚至是文本文件。
通常,.a文件被添加到编译的最后一个链接行。
zkure5ic2#
您在 .cpp 源代码中包含了一个二进制文件:
查找名为“liborientdb-c.h”的头文件,并将其包含在内(猜测,您可能希望包含所有适当的**.h* 头文件)。
你的makefile应该链接到上面的 .a 文件。