Bobisland 发表于 2023-10-9 15:51:02

代码出了什么错?

main.c

#include "sort.c"
#include <stdio.h>
int main()
{
    int arr[] = {5,4,7,34,5,7,2,3,6,9,0,2};
    int n = sizeof(arr) / sizeof(arr);
    sort(arr,n);

}


sort.c

#include <stdio.h>
void sort(int arr[],int n)
{
    for(int j = 1;j < n;j++)
    {
      int i = j - 1;
      int key = arr;
      while (i > 0 && arr > key) {
            arr = arr;
            i--;
      }
      arr = key;
    }
    for(int a = 0;a < n;a++)
    {
      printf("%d",arr);
    }
}


报错

====================[ 构建 | algorithms | Debug ]=================================
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build "/Volumes/My file/C/github/algorithms/cmake-build-debug" --target algorithms -j 6
Linking C executable algorithms
FAILED: algorithms
: && /Library/Developer/CommandLineTools/usr/bin/cc -g -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX14.0.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_namesCMakeFiles/algorithms.dir/main.c.o CMakeFiles/algorithms.dir/sort.c.o -o algorithms   && :
duplicate symbol '_sort' in:
    /Volumes/My file/C/github/algorithms/cmake-build-debug/CMakeFiles/algorithms.dir/sort.c.o
    /Volumes/My file/C/github/algorithms/cmake-build-debug/CMakeFiles/algorithms.dir/main.c.o
ld: 1 duplicate symbols
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

isdkz 发表于 2023-10-9 15:51:17

这个错误是因为在链接时出现了重复符号'_sort',即在sort.c和main.c中都定义了函数'sort',导致链接器无法确定应该使用哪个函数。要解决这个问题,可以将sort函数的定义放在一个单独的文件中,例如sort.h,然后在sort.c和main.c中包含sort.h头文件即可。

Mike_python小 发表于 2023-10-9 15:51:55

这个错误是由于存在重复的符号 "_sort" 引起的。重复符号意味着在链接过程中,编译器找到了相同名称的函数或变量定义。

在您的代码中,sort.c 文件中定义了 sort 函数,而 main.c 文件中也包含了 sort.c 文件。这导致在链接时出现重复的符号 "_sort"。

要解决这个问题,可以使用以下两种方法之一:

方法一:将 sort 函数的定义放在头文件中

sort.h

#ifndef SORT_H
#define SORT_H

void sort(int arr[], int n);

#endif


sort.c

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

void sort(int arr[], int n)
{
    // 排序逻辑
}



main.c

#include "sort.h"
#include <stdio.h>
int main()
{
    int arr[] = {5,4,7,34,5,7,2,3,6,9,0,2};
    int n = sizeof(arr) / sizeof(arr);
    sort(arr,n);
}


在这种方式下,sort 函数的定义被放在 sort.h 头文件中,并被包含在 sort.c 和 main.c 文件中,这样就避免了重复符号的问题。

方法二:只在 main.c 文件中包含 sort.c 文件

main.c

#include <stdio.h>

// 在主函数文件中直接定义 sort 函数,不需要另外引入 sort.c 文件
void sort(int arr[], int n)
{
    // 排序逻辑
}

int main()
{
    int arr[] = {5,4,7,34,5,7,2,3,6,9,0,2};
    int n = sizeof(arr) / sizeof(arr);
    sort(arr,n);
}


在这种方式下,可以直接将 sort 函数的定义放在主函数文件 main.c 中,而不需要包含 sort.c 文件。这样也能解决重复符号的问题。

您可以根据个人偏好选择其中一种方法来解决重复符号的错误。请注意,在使用方法二时,sort 函数的定义应该位于 main 函数之前,或者提前进行函数声明。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 代码出了什么错?