gpt4 book ai didi

c++ - 有目的地多次链接同一个对象时,如何避免多个定义错误?

转载 作者:行者123 更新时间:2023-11-30 01:23:39 25 4
gpt4 key购买 nike

I'm using gnu make, and gcc for compiling. I'm on linux (Ubuntu)

这是 black jack 游戏的图表,其中的节点代表最终的目标文件。 enter image description here


我组织了代码,每个类都在它自己的文件夹中。

tree -d
.
└── classes
├── dealer
│   └── hand
├── deck
│   └── card
│   ├── card_color
│   ├── card_suit
│   ├── card_value
│   └── colorizer
├── discard_pile
│   └── card
├── user
│   └── hand
│   └── card
└── user_choice

为了使文件系统表现得像一个图形,一些目录是符号链接(symbolic link)。
没有重复代码。
例如,如果实际的卡片代码在目录 deck 中,则 hand 和 discard_pile 文件夹中有指向该目录的符号链接(symbolic link)。


我遇到了多个定义错误,因为我的程序链接到所有子目录目标文件。
它将跟随符号链接(symbolic link)并最终多次收集一些目标文件。
我不能告诉它忽略符号链接(symbolic link)的文件夹,因为有时需要遵循它们。例如:如果我要在 dealer 文件夹中制作一个驱动程序,它需要收集 hand、card、card_color、card_suit、card_value、colorizer 对象(即使 hand 文件夹是一个符号链接(symbolic link))。


有没有办法继续收集重复的目标文件,但告诉 gcc 或 make 在链接之前忽略重复项?
因为是符号链接(symbolic link),所以路径名不同。
此外,可能存在对象名称相同但实现不同的情况。
我不确定如何确定重复的目标文件确实是同一个文件,并且不应链接多次。


我不想通过征求有关如何管理大型和扩展项目(其中实体关系很复杂)的建议来使这个问题过于笼统,但是如果您认为我的结构是荒谬的或有问题的,请指出问题以及您可以采用的其他方式。我试图避免将所有源文件都放在一个目录中,因为如果没有类图,就很难推导出这些关系。

最佳答案

只是因为您在不同的上下文中多次使用相同的函数并不意味着您需要多次链接它。

您的 card.cpp 需要放在一个公共(public)位置,以便您的所有不同组件都可以使用该位置。

通常,一个项目会有一组头文件和一组源文件(例如.cpp 或.c)。当我处理小项目时——源文件少于十几个,我只是将所有文件放在一个目录中。但是将它分开一点也没有错。但是,一个文件只能位于目录结构中的一个位置 [!!NO LINKS!!]。

头文件要么与它们各自的源文件一起,要么在单独的“include”目录中。

通常,源文件不“关心”头文件在哪里,它们只是“某处”。相反,您告诉编译器使用 -I ../some-component 在“../some-component”中查找 header 。

并且每个源文件只编译和链接一次,形成最终的二进制文件。

关于c++ - 有目的地多次链接同一个对象时,如何避免多个定义错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com