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

时间:2013-02-01 00:55:08

标签: c++ class gcc makefile relationship

  

我正在使用gnu make和gcc进行编译。我在linux(Ubuntu)

这是游戏黑色插孔的图表,其中节点代表最终的目标文件。 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

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


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


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


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

1 个答案:

答案 0 :(得分:5)

请原谅你在不同的环境中多次使用相同的功能并不意味着你需要连接多次。

您的card.cpp需要进入可供所有不同组件使用的公共位置。

通常,项目将包含一组头文件和一组源文件(例如.cpp或.c)。当我处理小项目 - 少于十几个源文件时,我只是将所有文件保存在一个目录中。但是让它更加分裂是没有错的。但是,文件应该只在目录结构中的一个位置[!! NO LINKS !!]。

头文件可以是各自的源文件,也可以是单独的“include”目录。

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

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