意外的未定义的引用 [英] Unexpected undefined reference

查看:251
本文介绍了意外的未定义的引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到一个未定义的引用的错误,不知道为什么。

I'm getting an undefined referenced error, not knowing the reason why.

所以,我有2个文件,这使得静态库:keyboard_input.c,keyboard_input.h

So I have 2 files which makes a static lib : keyboard_input.c, keyboard_input.h

下面是.h文件的内容:

Here's the content of the .h file:

#ifndef __MOD_KBINPUT__
#define __MOD_KBINPUT__

int kbInit();
int kbWait();

int kbTest();

#endif

和中的CMakeLists.txt文件看起来像这样:

And the CMakeLists.txt file looks like this:

FILE(
GLOB_RECURSE
sources
*.c
)
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/include/utils/kbreader")
ADD_LIBRARY(keyboardReader ${sources})

编译此lib中给出了一些警告:

Compiling this lib gives some warnings:

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中):

Now, for my main executable (main.cpp):

#include <keyboard_input.h>
int main()
{
  kbTest();
  return 0;
}

通过以下的CMakeLists.txt文件处理的:

Processed by the following CMakeLists.txt file:

include_directories("${PROJECT_SOURCE_DIR}/include/utils/kbreader")

file(
    GLOB_RECURSE
    srcs
    *.cpp
)

add_executable(
    PEM
    ${srcs}
)
target_link_libraries(PEM keyboardReader)

最后还是这个错误:

Ends up getting that error:

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()函数并不做任何事情,除了

The libkeyboardReader.a is created, and the kbTest() function doesn't do anything except

{return 0; }

如果我设置kbTest()在头文件的定义,它的工作原理。

If I set the definition of kbTest() in the header file, it works.

但有件事情我不明白,当我键入:让keyboardReader这里是输出:

But there's something i don't get, when i type: make keyboardReader here is the output:

[ 73%] Building C object src/utils/kbreader/CMakeFiles/KeyboardReader.dir/keyboard_input.c.o
[Warning explained above]
Linking C static library ../../../lib/libKeyboardReader.a

是不是有什么错吗?是否注意错误消息让我的lib忽略keyboard_input.c文件?

Is there something wrong? Does the note error message makes my lib omit the keyboard_input.c file?

推荐答案

您是混合C和C ++文件。为了使这项工作,你只需要告诉它调用C函数的C ++编译器,通过改变头文件,像这样:

You're mixing C and C++ files. To make that work, you just have to tell the C++ compiler that it's calling a C function, by changing the header file like so:

#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 ++的内部名称(签字其中EN codeS的所有类型的信息,这是什么让重载函数之间的连接区别),然后链接器不找到它。

Otherwise the C++ compiler assumes the function will be given a C++ internal name (which encodes all the type information in the signature, this is what lets the linker distinguish between overloaded functions) and then the linker doesn't find it.

这篇关于意外的未定义的引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆