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

Tre*_*key 1 c++ gcc makefile class relationship

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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


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


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


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

Mat*_*son 5

请原谅,在不同的上下文中多次使用相同的函数并不意味着您需要多次链接它.

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

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

头文件可以是各自的源文件,也可以是单独的"include"目录.

通常,源文件不会"关注"头文件所在的位置,它们只是"某处".相反,您告诉编译器在"../some-component"中查找标题-I ../some-component.

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