我正在尝试调用一个函数(来自#included 库),该函数将函数指针作为参数,并将指向 C 文件中函数的指针传递给该函数。编译器抛出“对 [函数名称] 的 undefined reference ”错误。
我尝试从 .c 文件中删除代码并将其直接放入 main.cpp 文件中(请参阅下面标记为“THIS WORKS”的部分)- 并且避免了错误。我知道我应该能够将它保存在 .c 文件中,因为我正在密切关注一个编译无误的示例。
/****************/
/*** MAIN.CPP ***/
/****************/
extern "C"
{
#include "btntask.h"
}
using namespace touchgfx;
/* Kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#define configGUI_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
#define configGUI_TASK_STK_SIZE ( 1024 )
static void GUITask(void* params)
{
/* STUFF */
}
/*********** THIS WORKS ************/
/*
void btn_tasked(void* params)/{
/* STUFF */
}
*/
/*********** THIS WORKS ************/
int main(void)
{
xTaskCreate(GUITask, "GUITask",
configGUI_TASK_STK_SIZE,
NULL,
configGUI_TASK_PRIORITY,
NULL);
/* error undefined reference to btn_task */
xTaskCreate(btn_task, "BTNTask",
512,
NULL,
configGUI_TASK_PRIORITY+1,
NULL);
for (;;);
}
这是 btntask.h
/****************/
/*** btntask.h ***/
/****************/
#ifndef BTNTASK_H
#define BTNTASK_H
void btn_task(void* params);
#endif /* BTNTASK_H */
这是 btntask.c
/****************/
/*** btntask.c ***/
/****************/
#include "btntask.h"
void btn_task(void* params)
{
/* STUFF */
}
编译日志如下:
Converting images
Compiling Core/Src/main.cpp
Linking TouchGFX/build/bin/target.elf
TouchGFX/build/ST/STM32F429IDISCO/Core/Src/main.o: In function `main':
d:\Dropbox\TouchGFXProjects\MiniGame\Project/Core/Src/main.cpp:116: undefined reference to `btn_task'
collect2.exe: error: ld returned 1 exit status
gcc/Makefile:363: recipe for target 'TouchGFX/build/bin/target.elf' failed
make[2]: *** [TouchGFX/build/bin/target.elf] Error 1
gcc/Makefile:359: recipe for target 'generate_assets' failed
make[1]: *** [generate_assets] Error 2
../gcc/Makefile:45: recipe for target 'all' failed
make: *** [all] Error 2
编译是通过我使用的软件包(TouchGFX)进行的。如果有帮助,这是日志中报告的编译命令:
touchgfx update_project --project-file=simulator/msvs/Application.vcxproj && touchgfx update_project --project-file=../EWARM/application.ewp && touchgfx update_project --project-file=../EWARM6/project.ewp && touchgfx update_project --project-file=../MDK-ARM/application.uvproj
make -f ../gcc/Makefile -j8
* 更新 * 我注意到 TouchGFX 填充了一个包含 .obj 文件的 Debug 文件夹,一个用于应用程序中的每个源代码文件,我可以看到它缺少一个 btntask.obj。显然它没有链接 btntask.obj 文件。我需要弄清楚为什么会这样。有一个 makefile 详细说明了所有链接,但它使用了很多我不熟悉的语法。
* 解决方案 * 结果是 Makefile 命名了一个要包含的目录列表。解决方案是编辑列表以添加我的 btntask 文件所在的其他目录。
# Directories containing application-specific source and header files.
# Additional components can be added to this list. make will look for
# source files recursively in comp_name/src and setup an include directive
# for comp_name/include.
components := TouchGFX/gui target TouchGFX/generated/gui_generated
感谢大家的参与。
最佳答案
你需要了解这两个概念:
名称修改
您可能需要在 btntask.c
文件以及头文件中将 btn_task
包装在 extern "C"
中。
由于您的项目包含 C++ 文件,因此您的 C 文件可能是由 C++ 编译器而非 C 编译器编译的。那么你的 C 函数实现是名称错误的。但是引用位置仍然使用未损坏的名称。
链接
不要忘记在链接阶段包含 btntask.c
的产品。
毕竟我对你们的工程管控软件不熟悉,这两点你们自己要保证。
关于c++ - 如何修复 C++ "Undefined reference to ..."C 函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54032002/