我现在正在开发一个嵌入式项目。相当一部分代码是通用 C 代码(与硬件没有任何联系),可以在普通的 x86 PC 上运行。我想在我的电脑上测试这些部分,以便我可以通过 valgrind 运行它。
问题是......链接。
该项目的结构如下(我无法更改):
lib
util.c
...
include
lib
util.h
logging.h
...
...
...
test
testrunner.py
tests
test1.c
...
在
util.c
中,我们同时包含 #include "lib/util.h"
和 #include "lib/logging.h"
。
现在我想在 testX.c 文件中使用 util(无 CMake)。
问题1:如何成功链接源文件和头文件?显然我只希望包含 util,而不是任何其他源/头文件。
问题 2: 处理 util 依赖于日志记录这一事实的最佳方法是什么(目前只是实现断言)。为我的电脑编写一个新的logging.h并链接到它是最简单的吗?
使用 gcc 编译时,如果不指定任何选项,则会隐式链接源文件与标头。
这里有一个例子:
main.c:
#include "head.h"
int main(void) {
printf("This is the main.\n");
someFunction();
return 0;
}
外部.c:
#include "head.h"
void someFunction() {
printf("This is a function.\n");
}
头.h
#ifndef HEAD_H
#define HEAD_H
#include <stdio.h>
extern void someFunction();
#endif // HEAD_H
您可以使用这个简单的 Makefile 来编译和链接这些文件:
all:
gcc -Wall main.c external.c -o program.exe
clean:
rm program.exe
它创建了
program.exe
,可以对其执行进行测试:./program.exe
。您将看到输出:
This is the main.
This is a function.
相反,gcc 可以编译,但如果指定
-c
选项则不会链接。然后,您可以通过链接来单独编译。你将需要一个像这样的 Makefile:
all:
gcc -Wall -c main.c external.c
gcc main.o external.o -o program.exe
rm main.o external.o
clean:
rm program.exe
这里,首先gcc编译源文件并创建目标文件。然后,它链接创建可执行文件的目标文件。