1

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

这是游戏黑杰克的图表,其中节点代表最终的目标文件。 在此处输入图像描述


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

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 对象(即使 hand 文件夹是符号链接)。


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


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

4

1 回答 1

5

仅仅因为您在不同的上下文中多次使用相同的功能并不意味着您需要多次链接它。

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

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

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

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

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

于 2013-02-01T01:01:26.160 回答