Cod*_*gle 3 c linker compilation include c-preprocessor
介绍
我是一名经验丰富的程序员,并且在面向对象范例方面拥有多年的经验.最近我决定尝试使用比C#或Java等语言更低级的语言更熟悉和舒适,所以我正在深入研究C,并试图用它创建一些游戏.
一切进展顺利,现在我试图通过将函数定义移动到单独的.c文件中来更好地组织我的代码.由于C中包含的性质,这是我开始感到不舒服的地方.我非常熟悉它的工作原理,并且在编译期间也处于预处理阶段.问题是我仍然不确定我是否正确处理了这个问题.
我认为我的问题类似于此处提出的问题.虽然它没有完全满足我需要知道的东西.
问题
基本上,我正在使用两个库创建一个OpenGL项目.一个是glew(对于OpenGL函数加载),另一个是GLFW(用于窗口处理和OpenGL上下文创建).我有两个.c文件,一个名为main.c,另一个名为windowInitialize.c.问题是,main.c和windowInitialize.c都依赖于glew和glfw库.
在我的main.c文件中,我执行以下操作包括:
#include "includes/GLEW/glew.h"
#include "includes/GLFW/glfw3.h"
#include "windowInitialize.h"
Run Code Online (Sandbox Code Playgroud)
此外,main.c执行以下相关函数调用:
if (!initializeGLFW())
return -1;
GLFWwindow *window = createOpenGLWindow(3, 3, 640, 480, "Hello OpenGL");
/* It is important that we initialize glew AFTER initializing GLFW and setting up
the OpenGL context, as GLEW needs a current context to work */
initializeGLEW();
Run Code Online (Sandbox Code Playgroud)
windowInitialize.c包含函数initializeGLFW和initializeGLEW的定义,以及createOpenGLWindow.所述的main.c源尽管仍然同时使用GLEW和GLFW对于主循环的目的,指的是功能和这样从两者.
现在,windowInitialize.c包含以下内容:
#include "windowInitialize.h"
#include "includes/GLEW/glew.h"
#include "includes/GLFW/glfw3.h"
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)
然后继续填写函数定义.这就是交易.如果glew和glfw库,以及stdio实际上(用于打印调试消息等),两个文件都需要使用.
我觉得这不是正确的做法,但我不确定.我相信编译器/链接器不抱怨双重声明的原因是因为main.c和windowInitialize.c获取了单独的目标代码文件.
我的问题是,链接器是否足够巧妙,只能将这些声明放在可执行文件中一次?即使我将这些标题包括在几个地方,它也不会对文件大小产生任何影响吗?这甚至是处理几个源文件之间的公共依赖关系的正确方法吗?或者我应该使用另一种方法?
你所描述的一切似乎都是正常的做事方式.您的两个编译单元只在这些头中获得相同的函数前向声明,而不是库中的实际重复定义.
我的问题是,链接器是否足够巧妙,只能将这些声明放在可执行文件中一次?
链接器当然不关心你包含的头文件 - 它是一个链接器,而不是编译器.
即使我将这些标题包括在几个地方,它也不会对文件大小产生任何影响吗?
函数的额外/未使用的前向声明对二进制大小没有影响.
这甚至是处理几个源文件之间的公共依赖关系的正确方法吗?
是的,你似乎是以完全正常的方式做事.
对于您的项目,您应该做的事情如下:
cc -c -o main.o main.c # compile main.c
cc -c -o windowInitialize.o windowInitialize.c # compile windowInitialize.c
cc -o myProgram main.o windowInitialize.o -lglew -lglfw # link objects with necessary libraries to create executable
Run Code Online (Sandbox Code Playgroud)
但是,真的,使用makefile会更好:
myProgram: main.o windowInitialize.o
cc -o $@ $^ -lglew -lglfw
Run Code Online (Sandbox Code Playgroud)
使用它的例子:
$ make
cc -c -o main.o main.c
cc -c -o windowInitialize.o windowInitialize.c
cc -o myProgram main.o windowInitialize.o -lglew -lglfw
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |