<分区>
我知道这个问题已经被问过好几次(以类似的方式),但我不认为它是重复的,因为我的代码已经实现了提供给其他提问者的解决方案。如果我忽略了什么,我的问题当然可能会被标记为重复和降级。
我不得不使用外部变量,因为根据任务,我不能将它作为参数传递。问题:如果我想编译代码,则会抛出“ 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”(本地)而不是外部(全局)的错误位置。所以,准确地说,我的误解是对外部声明与其定义之间范围的估计,如果你明白我的意思的话。诚然,这不是天才之举。 ;-) 感谢您的帮助!