一、编译环境添加
如果编译的文件在main文件夹下,在main文件夹下的CMakeLists.txt中添加对应的.c文件,如下图所示。
二、常见问题
1- undefined reference to xxx
C语言中使用static修饰函数时,意味着该函数的作用域仅限于定义它的文件。如果你在另一个文件中调用这个函数,编译器会找不到这个函数的定义,因此会报"undefined reference to"错误。
在对应的.c及声明文件.h中去掉函数中的"static"关键字。
例如,如果你有两个文件:file1.cpp 和 file2.cpp。
file1.cpp:
c
#include <iostream>
static void myFunction() {
std::cout << "Hello, world!" << std::endl;
}
file2.cpp:
c
void callMyFunction() {
myFunction(); // 这里会报错,因为myFunction是static的,作用域仅限于file1.cpp
}
要解决这个问题,你有几个选项:
1、移除static修饰符:如果myFunction需要在多个文件中被访问,就不应该使用static修饰它。
2、**在需要使用函数的文件中重新定义函数:**这通常不是最佳做法,因为它会导致代码冗余。
3、将函数声明和定义放在一个头文件中,并在需要的文件中包含这个头文件:这样,函数就可以在多个文件中被访问,但仍然只会有一个定义。
选择哪种方法取决于你的具体需求和项目的结构。**如果函数是通用的,建议移除static修饰符,并在适当的地方声明和定义函数。**如果函数是特定于某个文件的,保留static修饰符,并确保只在该文件内调用它。
2- multiple definition of xxx
在 C 或 C++ 的项目中,.h 文件(头文件)通常用于声明函数、变量、类型等,而 .c 或 .cpp 文件用于定义这些函数和变量。如果在 .h 文件中定义了变量,那么在多个 .c 或 .cpp 文件中包含这个头文件时,就会出现"multiple definition of"(多重定义)的错误。
这是因为每个包含该头文件的源文件都会创建一个该变量的副本,导致链接时变量重复定义。
解决方法:
1、在头文件中声明变量,在源文件中定义变量:
在 .h 文件中使用 extern 关键字声明变量,而不是定义它。
在一个 .c 或 .cpp 文件中定义该变量。
例如:
c
// myheader.h
extern int myVariable;
// myfile.c
#include "myheader.h"
int myVariable = 10;
2、使用 static 关键字:
在头文件中定义变量时,可以使用 static 关键字,这样每个包含该头文件的源文件都会有该变量的一个独立副本,链接器不会报错。
例如:
c
// myheader.h
static int myVariable = 10;
使用匿名命名空间或内联变量(C++17 起):
如果你使用的是 C++,可以考虑将变量放在匿名命名空间中,或者使用 inline 关键字(C++17)。
例如:
c
// myheader.h
namespace {
int myVariable = 10;
}
// 或者
inline int myVariable = 10;
选择哪种方法取决于你的具体需求,例如是否需要跨多个文件共享同一个变量。通常,第一种方法是最常见的做法。