Clang如何处理具有相同名称的多个源文件?

时间:2019-01-18 07:43:08

标签: c++ clang linker-errors c++builder

我目前正在使用C++-Builder of RAD 10.2,使用的是旧的经典Borland编译器,并且在某些项目中使用了相同的命名源文件。尽管文件名相同,但是所包含的类位于不同的命名空间中,它们也用作子文件夹,因此项目内的相对路径始终是唯一的。考虑以下类及其存储的目录作为示例:

view::files_chooser::chosen_files::Dnd
view/files_chooser/chosen_files/Dnd.cpp

view::send_details::recipients::Dnd
view/send_details/recipients/Dnd.cpp

在整个项目的编译过程中,将创建以下两个目标文件:

Win32\Debug\tmp\Dnd.obj
Win32\Debug\tmp\Dnd_0.obj

没有办法知道哪个目标文件属于哪个类,并且从理论上讲,如果每个目标文件都始终被编译,这不是问题。但是,如果没有,那么重要的是要知道要替换哪个目标文件,并且当前的行为是总是替换没有索引的文件。取决于以前的版本,如果“ Dnd_0.obj”包含另一个类,则可能有效,但如果不包含,则现在缺少目标文件或另一个类,并且链接失败。

[ilink32 Error] Error: Unresolved external 'view::send_details::recipients::Dnd::~Dnd()' referenced from C:\USERS\[...]\WIN32\DEBUG\TMP\FMSENDDETAILS.OBJ
[ilink32 Error] Error: Unresolved external 'view::send_details::recipients::Dnd::Dnd(view::send_details::recipients::All&, view::send_details::recipients::Events&)' referenced from C:\USERS\[...]\WIN32\DEBUG\TMP\FMSENDDETAILS.OBJ
[ilink32 Error] Error: Unresolved external 'view::send_details::recipients::Dnd::updateDragDetailsSrc(System::TObject *, unsigned int)' referenced from C:\USERS\[...]\WIN32\DEBUG\TMP\FMSENDDETAILS.OBJ
[ilink32 Error] Error: Unresolved external 'view::send_details::recipients::Dnd::disallowRowOn(System::TObject *, unsigned int, bool&) const' referenced from C:\USERS\[...]\WIN32\DEBUG\TMP\FMSENDDETAILS.OBJ
[ilink32 Error] Error: Unresolved external 'view::send_details::recipients::Dnd::onOleDragStop(System::TObject *, int)' referenced from C:\USERS\[...]\WIN32\DEBUG\TMP\FMSENDDETAILS.OBJ
[ilink32 Error] Error: Unresolved external 'view::send_details::recipients::Dnd::updateDragDetailsDest(System::TObject *, unsigned int)' referenced from C:\USERS\[...]\WIN32\DEBUG\TMP\FMSENDDETAILS.OBJ
[ilink32 Error] Error: Unable to perform link

无需编译整个项目,而只需编译两个单独的类,就可以很容易地实现这一点。 RAD似乎没有使用类文件名到目标文件名的稳定映射,这可以轻松解决此问题。有些人在Visual Studio中报告了类似的问题,但这似乎提供了一种手动定义目标文件的结果文件名的方法。我在RAD中找不到的东西。

Clang如何处理此类情况?是否也总是将目标文件存储在一个目录中?它使用某种稳定的命名方案还是能够保留项目的内部相对目录层次?

谢谢!

根据要求,以下是示例命令行调用。因为它包含要生成的输出文件(-o.\Win32\Debug\tmp\Dnd.obj)的路径,所以我想切换到Clang本身并没有改变,正如已经提出的注释一样。

bcc32 command line for "..\..\..\..\src\src\view\files_chooser\chosen_files\Dnd.cpp"
  c:\program files (x86)\embarcadero\studio\19.0\bin\bcc32.exe -D_DEBUG;Winapi_MsxmlintfHPP;LOG4CXX_STATIC;XERCES_STATIC_LIBRARY -n.\Win32\Debug\tmp 
  -I[...] -y -Q -k -r- -c -tM -tW -C8 
  -o.\Win32\Debug\tmp\Dnd.obj -w-par -Od -v -vi- -H=.\Win32\Debug\tmp\raw.pch -H ..\..\..\..\src\src\view\files_chooser\chosen_files\Dnd.cpp 
Success
Elapsed time: 00:00:00.4

0 个答案:

没有答案