代码之家  ›  专栏  ›  技术社区  ›  TC.

是否可以在一个VisualStudioC++项目中拥有相同命名的源文件?

  •  3
  • TC.  · 技术社区  · 16 年前

    我正在为我正在学习的C++课程做静态库项目。老师坚持每个源文件只定义一个函数,将属于同一类的文件/函数分组到每个类的子目录中。这将产生如下结构:

    MyClass
        \MyClass.cc (constructor)
        \functionForMyClass.cc
        \anotherFunctionForMyClass.cc 
    OtherClass
        \OtherClass.cc (constructor)
    

    我不想讨论这是否是一个好的实践,因为我必须以这种方式组织我的项目。

    我在VisualStudio2008中工作,在两个类中使用同名函数(以及文件名)时,不知怎的出现了奇怪的链接错误。这似乎是由于VisualStudio将所有 .obj 一个中间目录中的文件(每个源文件一个),在编译同名源文件时覆盖先前生成的目标文件。

    这可以通过基于输入文件的相对路径将对象文件放在子目录中来解决。VisualStudio允许配置它生成的对象文件的名称,并在其中使用宏,但似乎没有用于“输入文件的相对路径”的宏。

    9 回复  |  直到 16 年前
        1
  •  6
  •   Igor Zevaka    16 年前

    Project Properties-C/C++-Output Files-Object File Name http://img37.imageshack.us/img37/3695/outputfile.png

    附言:听起来讲师有一个蹩脚的(可能是他自己写的)自动代码验证程序来施加这个限制。为了获得额外的分数,可以重写解析器,使其能够与正常/正常/非怪异的projet布局一起工作。

        2
  •  6
  •   gsamaras a Data Head    11 年前

    真正的答案:

    改变

    C/C++=>输出文件=>输出文件名

    每个.obj文件都将在子文件夹中创建,因此它不会在链接时覆盖上一个。

        3
  •  4
  •   Chris Becke    16 年前

    你有一些机会-

    1. 您可以为每个类创建一个静态库。在静态libs中链接时,obj文件都打包在.lib中,因此冲突不再是问题。

    2. 把comp-sci课程换成一门不是由疯子教的课程。说真的,这个家伙完全脱离了行业最佳实践,并试图将他们自己的怪异想法强加给学生:这些想法在他们离开教学环境的那一刻就必须被忘却。

        4
  •  1
  •   alemjerus    16 年前

        5
  •  1
  •   Michael Kohne    16 年前

    您可以使用文件名中的类名来消除歧义吗?我想你可能有

    类名 \函数1_MyClass.cc \函数2_MyClass.cc

        6
  •  1
  •   quamrana Ryuzaki L    16 年前

    查看了帮助文件后,我认为您应该转到projectproperties/C++/Outpuf files/Object File Name:并输入 $(InputDir) (后面没有反斜杠)。然后,每个源文件都应该继承此属性和 .obj

    你可能需要做一个测试 Clean Solution

        7
  •  1
  •   JoeG    16 年前
    • 重命名对象文件会起作用,但会很痛苦, . 我一直不知道为什么,但如果对象文件没有默认名称,似乎会混淆Visual Studio。

    • 可以用类名作为函数名的前缀;e、 g.myclass-ctor.cc、myclass-function1.cc等。

    • 每个类可以有一个.cc文件,其中包含各个函数文件。在这种情况下,您需要防止单独编译#包含的文件(重命名其扩展名或设置属性->从生成中排除到“是”)。

    如果不是,那么为每个类使用一个项目是最好的解决方法吗?

    这不是一个好主意-除了你最终不会得到一个静态库(没有更多的诡计),你的链接时间可能会增加,这将隐藏一个错误 来自优化器的大量相关信息。

        8
  •  0
  •   Andrew McGregor    16 年前

    你不必把它们放在不同的翻译单位。。。为什么不把每个函数放在一个.h中,并将它们全部包含在一个.cc中?这很可能会从编译器中获得更好的输出。

        9
  •  0
  •   Dude    13 年前

    在VisualStudio2010中,我设置

        Properties -> C/C++ -> Output Files -> Output File Name
    

        V:\%(Directory)$(PlatformName)_$(ConfigurationName)_%(Filename).obj
    

    V (目前还不知道是否有宏)。

    顺便说一句: $(InputDir)