c - 为什么我得到 "undefined reference"- 变量标记为 'extern' 的错误?链接器问题?

标签 c cmake linker extern undefined-reference

<分区>

我知道这个问题已经被问过好几次(以类似的方式),但我不认为它是重复的,因为我的代码已经实现了提供给其他提问者的解决方案。如果我忽略了什么,我的问题当然可能会被标记为重复和降级。

我不得不使用外部变量,因为根据任务,我不能将它作为参数传递。问题:如果我想编译代码,则会抛出“ undefined reference ”错误。

代码:

header.h

#ifndef TEST_HEADER_H
#define TEST_HEADER_H

extern int var;

void increment();

#endif //TEST_HEADER_H

source1.c

#include <stdio.h>
#include "header.h"

int main ()
    {
        int var = 1;
        printf("1) %d\n", var);

        increment();
        printf("2) %d\n", var);

        return 0;
    }

source2.c

#include "header.h"

void increment()
    {
        var++;
    }

编译错误:

====================[ Build | test | Debug ]====================================
/root/clion-2019.1/bin/cmake/linux/bin/cmake --build /root/CLionProjects/test/cmake-build-debug --target test -- -j 2
Scanning dependencies of target test
[ 33%] Building C object CMakeFiles/test.dir/source1.c.o
[ 66%] Building C object CMakeFiles/test.dir/source2.c.o
[100%] Linking C executable test
/usr/bin/ld: CMakeFiles/test.dir/source2.c.o: in function `increment':
/root/CLionProjects/test/source2.c:5: undefined reference to `var'
/usr/bin/ld: /root/CLionProjects/test/source2.c:5: undefined reference to `var'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/test.dir/build.make:100: test] Fehler 1
make[2]: *** [CMakeFiles/Makefile2:73: CMakeFiles/test.dir/all] Fehler 2
make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/test.dir/rule] Fehler 2
make: *** [Makefile:118: test] Fehler 2

CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project(test C)

set(CMAKE_C_STANDARD 11)

add_executable(test source1.c header.h source2.c)

我还尝试将以下内容添加到 CMakeLists.txt,因为它有助于解决“ undefined reference ”错误的另一种情况,但在这种情况下没有任何区别。

find_library(LIBRT rt)
if(LIBRT)
    target_link_libraries(test ${LIBRT})
endif()

我不认为问题出在代码中,对吗?我认为这是在链接过程中。有人可以帮忙吗?提前致谢!

编辑:

它现在运行。我的问题不是我无法区分声明和定义,正如某些人假设的那样,而是我将“source1.c”中的定义设置在“main”(本地)而不是外部(全局)的错误位置。所以,准确地说,我的误解是对外部声明与其定义之间范围的估计,如果你明白我的意思的话。诚然,这不是天才之举。 ;-) 感谢您的帮助!

最佳答案

你误解了 extern 的意思。

将变量(或函数)标记为 extern 不会定义(创建)该变量。相反,它只是声明它存在于某处。您在任何地方都没有 var 的定义。

在您的 main 中,您有 int var = 1; 但该定义是 localmain。它不是全局的,任何其他功能都无法访问。

您应该将该变量定义移出main:

#include <stdio.h>
#include "header.h"

int var = 1;

int main ()
{
    printf("1) %d\n", var);

    increment();
    printf("2) %d\n", var);

    return 0;
}

相关说明:您应该避免使用全局变量。它们导致代码难以理解、调试和维护。

关于c - 为什么我得到 "undefined reference"- 变量标记为 'extern' 的错误?链接器问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55951649/

相关文章:

c - 在 Windows 上诊断 C 应用程序崩溃的工具/技术

c - 卡在 C 中的赋值上

c - 下面的代码在 C 中做了什么?

c++ - 有没有一种好的跨平台方法来使用 CMake 包含外部 C++ 库?

c++ - QT5 和 Antlr4.8 不能用 Cmake 和 QT Creator 编译

c++ - 链接和绑定(bind)有什么区别?

c - 101 到 201 之间的奇数之和

opencv - 为什么 CLion 不将我的项目与 Windows 版 OpenCV 链接?

c++ - 使用不同的 C++ 环境创建 DLL

c++ - 如何检查库是否使用 -fno-rtti 编译?