alpha49 2023-02-28 17:48 采纳率: 61.1%
浏览 27
已结题

Clion编写静态库时遇到了奇怪的问题,我也描述不清楚,求解答

今天我在尝试使用Clion写静态链接库的时候,发现了这样一个问题:
这个是头文件的代码:

img

#ifndef DB_HELLO_H
#define DB_HELLO_H

#include "stdio.h"

typedef struct{
    int a;
    int b;
}ts;

ts c = {
        .a = 6,
        .b = 10
};

void say(int a);

#endif

这个是c文件的代码:

img

#include "hello.h"

void say(int num) {
    printf("%d\n", num);
}


构建之后得到了.a静态库

img

新建一个文件,配置Cmake文件如下:

img


链接头文件与静态库

之后在c文件里编写如下代码:

img

#include "hello.h"

int main() {
    say(c.a);
}

出乎我意料的是,它报错了,报错如下:

img

FAILED: t1.exe
cmd.exe /C "cd . && E:\CLION2~1.1\bin\mingw\bin\gcc.exe -g CMakeFiles/t1.dir/main.c.obj -o t1.exe -Wl,--out-implib,libt1.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -LC:/Users/Administrator/CLionProjects/untitled -LG:/Cproject/lib -Wl,-Bstatic -ldb -Wl,-Bdynamic -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
E:\CLion 2022.3.1\bin\mingw\bin/ld.exe: G:/Cproject/lib\libdb.a(hello.c.obj):C:/Users/Administrator/CLionProjects/db/hello.h:11: multiple definition of `c'; CMakeFiles/t1.dir/main.c.obj:G:/Cproject/include/hello.h:11: first defined here
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

然后我又尝试另一种方案,使用printf:

img

#include "hello.h"

int main() {
    printf("%d", c.a);
}

这次运行没有报错,打印出了正确的数字

img

这很出乎我的意料,结构体c中的成员a给say()函数使用会报错,但是给printf()函数却不会报错,明明功能一样,只是该结构体定义在了头文件内部,跟这个有关系吗?
这里我是用的是clion的默认配置:

img

求解答,感谢
  • 写回答

1条回答 默认 最新

  • 元气少女缘结神 2023-02-28 18:02
    关注

    虽然你头文件加了宏,防止hello.h被重复包含(即你这里hello.c,main.c中都包含hello.h没关系),但是你无法防止你定义的变量c被重复包含,所以它报了重定义的错。
    而当你改成printf后,不用hello.c中的say,相当于此时没有hello.c,而只有main.c执行只包含了一次hello.h,即你的变量c只被定义了一次,故没有重定义,所以不会再报错。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月9日
  • 已采纳回答 3月1日
  • 创建了问题 2月28日

悬赏问题

  • ¥15 docker环境配置
  • ¥20 绿盟安全扫描--检测到目标站点存在javascript框架库漏洞
  • ¥30 Android STD快速启动
  • ¥15 如何使用simulink建立一个永磁同步直线电机模型?
  • ¥30 天体光谱图的的绘制并得到星表
  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现