Как Clang обрабатывает несколько исходных файлов с одинаковыми именами? - PullRequest
0 голосов
/ 18 января 2019

Я использую 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 обрабатывает такие случаи? Хранит ли он объектные файлы в одном и том же каталоге всегда? Использует ли он какую-то стабильную схему именования или способен сохранить внутреннюю относительную иерархию dir проекта?

Спасибо!

По запросу ниже приведен пример вызова командной строки. Поскольку он содержит путь к выходному файлу для генерации (-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
...