c - 如何在 C 中编写正确的包含和模块化我的应用程序?
问题描述
我再次寻求您的帮助:) 在#includes 中找不到错误,检查了几次,与 geekstogeeks 示例和类似问题进行了比较。所以我有:
/tmp/ccWUaJkV.o:/home/felix/Programming/dypak/objects.obj:27: multiple definition of `RankNames'
/tmp/ccA7hhxl.o:/home/felix/Programming/dypak/objects.obj:27: first defined here
/tmp/ccWUaJkV.o:/home/felix/Programming/dypak/objects.obj:28: multiple definition of `SuitNames'
/tmp/ccA7hhxl.o:/home/felix/Programming/dypak/objects.obj:28: first defined here
/tmp/ccWUaJkV.o:(.bss+0x0): multiple definition of `__odr_asan.SuitNames'
/tmp/ccA7hhxl.o:(.bss+0x0): first defined here
/tmp/ccWUaJkV.o:(.bss+0x1): multiple definition of `__odr_asan.RankNames'
/tmp/ccA7hhxl.o:(.bss+0x1): first defined here
collect2: error: ld returned 1 exit status
编译后
gcc -rdynamic -std=c11 `pkg-config --cflags gtk+-3.0` cardmethods.c main.c -o main `pkg-config --libs gtk+-3.0` -lX11
对象.obj
#include <stdbool.h>
#ifndef OBJECTS_O_
#define OBJECTS_O_
typedef struct myCard{
bool trump;
...
} card;
typedef struct {
...
} widgetsPtrs;
card *Deck;//pointer to the deck.
/************************************HERE****************************/
char *RankNames[] = {" 6 ", " 7 ", " 8 ", ...};
char *SuitNames[] = {"Hearts", "Spades", "Diamonds", "Clubs"};
#endif
卡片方法.h
#include <stdbool.h>
#include <gtk/gtk.h>
#include "objects.obj"
#ifndef CARDMETHODS_H_
#define CARDMETHODS_H_
void addCard(card *pile, card *cardAdded);
void printAll(card *pile);
...
#endif
卡片方法.c
#include "cardmethods.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
void addCard(card *pile, card *cardAdded){
...
}
void printAll(card *pile){
...
}
...
主程序
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include "cardmethods.h"
...
int main (int argc,
char **argv)
{
...
return 0;
}
解决方案
您已经在头文件中定义了变量RankNames
和SuitNames
。因此,它们在 main.c 和 cardmethods.c 中都有定义。然后当这些文件被链接时,链接器会找到多个定义。
更改头文件以具有这些变量(和Deck
)的外部声明:
extern card *Deck;
extern char *RankNames[];
extern char *SuitNames[];
并将定义放在一个源文件中,可能是 cardmethods.c:
card *Deck;
char *RankNames[] = {" 6 ", " 7 ", " 8 ", ...};
char *SuitNames[] = {"Hearts", "Spades", "Diamonds", "Clubs"};
推荐阅读
- node.js - Dropbox 图像 URL 未在我的移动应用(iOS Chrome)中呈现为
- java - Why must I declare an exception if I know it will never be thrown?
- python - 如何在 Python 中使用多个 if 语句创建菜单
- catboost - Catboost Java 接口
- tensorflow - 如何从 Tensorflow 结果中的 .pb 文件中获取 .weights 文件
- laravel - 如何选择特定字段,包括 withCount
- sql-order-by - 按不为空的最高列数顺序列出行
- javascript - 如何使用 javascript 和基于 API 的 json 数据创建动态 html 表单?
- python - 将附加变量附加到 npz 文件
- yarnpkg - 错误的解决方案是什么:找不到模块'yargs'