我收到 undefined reference 错误,但不知道原因。
所以我有 2 个文件可以生成静态库:keyboard_input.c、keyboard_input.h
这是 .h 文件的内容:
#ifndef __MOD_KBINPUT__
#define __MOD_KBINPUT__
int kbInit();
int kbWait();
int kbTest();
#endif
CMakeLists.txt 文件如下所示:
FILE(
GLOB_RECURSE
sources
*.c
)
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/include/utils/kbreader")
ADD_LIBRARY(keyboardReader ${sources})
编译此库会发出一些警告:
src/utils/kbreader/keyboard_input.c: In function ‘kbInit’:
src/utils/kbreader/keyboard_input.c:13:14: warning: assignment from incompatible pointer type [enabled by default]
src/utils/kbreader/keyboard_input.c: In function ‘kbWait’:
src/utils/kbreader/keyboard_input.c:21:55: warning: passing argument 4 of ‘fread’ from incompatible pointer type [enabled by default]
/usr/include/stdio.h:708:15: note: expected ‘struct FILE * __restrict__’ but argument is of type ‘struct FILE *’
现在,对于我的主可执行文件(main.cpp):
#include <keyboard_input.h>
int main()
{
kbTest();
return 0;
}
由以下 CMakeLists.txt 文件处理:
include_directories("${PROJECT_SOURCE_DIR}/include/utils/kbreader")
file(
GLOB_RECURSE
srcs
*.cpp
)
add_executable(
PEM
${srcs}
)
target_link_libraries(PEM keyboardReader)
最终出现该错误:
CMakeFiles/PEM.dir/main.cpp.o: In function `main':
main.cpp:(.text+0xb): undefined reference to `kbTest()'
collect2: ld returned 1 exit status
make[2]: *** [src/PEM/main2/PEM] Error 1
make[1]: *** [src/PEM/main2/CMakeFiles/PEM.dir/all] Error 2
libkeyboardReader.a 已创建,kbTest() 函数除此之外不执行任何操作
{return 0; }
如果我在头文件中设置 kbTest() 的定义,它就可以工作。
但是当我输入时,有一些东西我不明白:make KeyboardReader 这里是输出:
[ 73%] Building C object src/utils/kbreader/CMakeFiles/KeyboardReader.dir/keyboard_input.c.o
[Warning explained above]
Linking C static library ../../../lib/libKeyboardReader.a
有什么问题吗?注释错误消息是否使我的库省略了keyboard_input.c 文件?
最佳答案
您正在混合 C 和 C++ 文件。要实现这一点,您只需通过更改头文件来告诉 C++ 编译器它正在调用 C 函数,如下所示:
#ifndef MOD_KBINPUT
#define MOD_KBINPUT
/* note I also fixed the macro so you aren't using a system-reserved name */
#if __cplusplus
/* this is the important part */
extern "C" {
#endif
int kbInit();
int kbWait();
int kbTest();
#if __cplusplus
}
#endif
#endif
否则,C++ 编译器会假定该函数将被赋予一个 C++ 内部名称(它对签名中的所有类型信息进行编码,这使链接器能够区分重载函数),然后链接器找不到它。
关于c++ - 意外的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29330938/