无论有或没有 -c 选项,gcc 都不解析外部全局变量
所以我有这个问题:我在我的 C 程序中声明一些外部全局变量。 如果我不使用 gcc 的 -c 选项,则会出现未定义的引用错误。但使用 -c 选项时,链接未完成,这意味着我没有生成可执行文件。
那么我该如何解决这个问题呢?
这是我的 makefile (感谢 Alex 编写)
CC = gcc # compiler/linker frontend
INCL = -I$(INCL_DIR) # includes
DEFS = -D_DEBUG_ # defines
CFLAGS = -g $(INCL) $(DEFS) # compiler flags
LFLAGS = -lpthread -lm -g # linker flags
OBJ = approx.o producteur.o sequentialApproximation.o main.o
BIN = calculPi.exe
LINKOBJ = approx.o producteur.o sequentialApproximation.o main.o
RM = rm -fv
all: $(BIN)
clean:
${RM} *\~ \#*\# $(OBJ)
clean_all: clean
${RM} $(BIN)
cleanall: clean
${RM} $(BIN)
$(BIN): $(OBJ)
$(CC) $(LFLAGS) -o $@ $^
main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h
.c.o:
$(CC) $(CFLAGS) -c $<
这是 make 的输出: http://pastebin.com/NzsFetrn< /a>
我确实在 approx.h 中声明了外部变量(外部和全局),并且我尝试在 approx.c 中调用它们,但它不起作用。
So i have this issue : i am declaring some extern global variables in my C program.
If I don't use the -c option for gcc, i get undefined references errors. But with that -c option, the linking is not done, which means that i don't have an executable generated.
So how do I solve this?
Here is my makefile (written thanks to Alex)
CC = gcc # compiler/linker frontend
INCL = -I$(INCL_DIR) # includes
DEFS = -D_DEBUG_ # defines
CFLAGS = -g $(INCL) $(DEFS) # compiler flags
LFLAGS = -lpthread -lm -g # linker flags
OBJ = approx.o producteur.o sequentialApproximation.o main.o
BIN = calculPi.exe
LINKOBJ = approx.o producteur.o sequentialApproximation.o main.o
RM = rm -fv
all: $(BIN)
clean:
${RM} *\~ \#*\# $(OBJ)
clean_all: clean
${RM} $(BIN)
cleanall: clean
${RM} $(BIN)
$(BIN): $(OBJ)
$(CC) $(LFLAGS) -o $@ $^
main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h
.c.o:
$(CC) $(CFLAGS) -c lt;
And here is the output of make : http://pastebin.com/NzsFetrn
I did declare extern variables in approx.h (extern and global) and i try to call them in approx.c, and there it doesn't work.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
解决方案 1
您不能在链接阶段传递
-c
,因为这会告诉编译器跳过链接。您的问题
在于
$(CXX)
扩展为gcc -g -c -lpthread -lm ...
删除
-c
那里。从源模块编译到目标模块时仅传递 -c。
解决方案 2
关于第二个问题,您实际上并没有在任何地方定义变量。在您的
.c
文件中,您需要以下行:(假设您确实需要全局变量)。这将修复未解决的外部错误。
在他们被分配之前你不能给他们写信!
注释
另请注意,您可以在一条规则中指定如何从源构建目标文件:
并在没有规则的情况下指定依赖项:
等等。
其他注释。
另外,根据一般经验,
CXX
应仅包含编译器名称,不包含标志。这些应该放在CXX_FLAGS
中。为什么您将其称为CXX
而不是CC
?如果您需要 C++ 编译器,请使用g++
,或者使用CC
。由于您有.c
文件,因此我假设为 C。因此,在您的情况下,您应该将: 更改为
并且您不需要单独的
LINK_CXX
。示例 Makefile
因此,最小的 Makefile 应该如下所示:
Solution 1
You can't pass
-c
in your linking phase, as that will tell the compiler to skip linking.Your problem is
with
where
$(CXX)
expands togcc -g -c -lpthread -lm ...
get rid of the
-c
there.Only pass -c when compiling from source to object modules.
Solution 2
Re the second problem, you aren't actually defining the variables anywhere. In your
.c
file you need the lines:(Assuming you really want global variables). This will fix the unresolved external error.
You can't write to them until they've been allocated!
Notes
Also note that you can specify how to build object files from source in one rule:
and specify the dependencies without rules:
etc.
Other notes.
Also, as general rule of thumb,
CXX
should only contain the compiler name, no flags. Those should go inCXX_FLAGS
. And why are you calling itCXX
notCC
? Useg++
if you want a C++ compiler, or useCC
. Since you have.c
files, I'll assume C. So in your case, you should change:to
And you don't need a separate
LINK_CXX
.Sample Makefile
So a minimal Makefile should look like: