Проблемы увязки индекса MSVC встроенные функции использовать Clang для Windows


Я меняю большую кодовую базу с использования msvc на clang для продукта windows. Этот продукт использует большое количество встроенных компонентов компилятора msvc, таких как _InterlockedOr и т. д. Если я создаю небольшую тестовую программу с использованием clang на windows, она строится, связывается и работает просто отлично, но если я создаю библиотеку из нашего продукта, которая использует встроенные компоненты, она появляется как отсутствующий символ.

Я попытался скомпилировать и тестовый код, и наш продукт, используя опцию -- verbose, и ничего не смог обнаружить. между ними все по-другому. Единственное различие в способе их вызова заключается в том, что большой продукт строится с использованием fastbuild, что требует использования-c, чтобы предотвратить вызов компилятором компоновщика. Clang, очевидно, добавляет в некоторые библиотеки, которые отсутствуют, когда я вызываю компоновщик вручную сам, поэтому кто-нибудь может сообщить мне, что они могут быть? (Я уже связываю в библиотеке crt (libcmt, msvcrt), так что это не так.

Я начал писать свою собственную библиотеку внутренних функций в сборка, которая забавна, но не должна быть необходимой. Кто-нибудь?

Согласно запросу, компиляция следующего кода с clang работает при его непосредственном использовании, т. е. clang IntrinsicsTest.cppсоздает exe.

IntrinsicsTest.cpp
#include "stdio.h"
#include "intrin.h"

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned long long r = __rdtsc();
    printf("Intrinsic: %llun", r);
}

Все же не удается связать при вызове через fastbuild: FBuild.exe -showcmds -clean IntrinsicsTest_debug_x86

Лязг.exe " IntrinsicsTest.ЧГК" -D_WINDOWS -с-М32 -mfpmath=sse по -D_UNICODE -DUNICODE -ФНО-библиотеку RTTI -fexceptions -е ... IntrinsicsTest.отлаживать.Win32.lib

Lib.exe / NOLOGO / OUT:"... IntrinsicsTest.отлаживать.Win32.либ" "... IntrinsicsTest.параметр obj" ... IntrinsicsTest.отлаживать.Win32.exe

Ссылка.exe / NOLOGO / INCREMENTAL: NO / OUT:"... IntrinsicsTest.отлаживать.Win32.исполняемый" "... IntrinsicsTest.obj " - defaultlib: libcmt.либерал-инкрементального -манифест /машина:х86 /подсистемы:консоли /опт:NOICF параметр /opt:NOREF

Внутренний тест.obj: ошибка LNK2019: неразрешенный внешний символ __ _ rdtsc, на который ссылается функция _wmain ... IntrinsicsTest.отлаживать.Win32.exe

Фатальная ошибка LNK1120: 1 неразрешенная внешние факторы

2 2

2 ответа:

Я решил этот вопрос. Было несколько факторов, влияющих на то, как взаимодействовали fastbuild, clang и msvc.

A/ с Clang на Windows нет необходимости указывать" system " включает. В нашем проекте у нас были пути включения как:

-I"C:/Program Files/LLVM/lib/clang/3.8.0/include" 
-I"C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/" 
-I"C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/atlmfc/include" 
-I"C:/Program Files (x86)/Windows Kits/8.1/include/um" 
-I"C:/Program Files (x86)/Windows Kits/8.1/include/shared"
-I"C:/Program Files (x86)/Windows Kits/8.1/include/winrt"

Clang-версия xmmintrin объявляет встроенные компоненты встроенными, и, таким образом, если этот заголовок используется, то тестовая программа компилируется нормально. Windows xmmintrin объявляет встроенные функции как функции extern, следовательно, программа компилирует, но не связывает - где сборка msvc получает эти символы, теперь не имеет значения.

Однако, даже с clang include path first, когда <intrin.h> включен чем-либо, он тянет в заголовке windows.

B / Fastbuild позволяет настроить переменные среды для сборки env. Наши скрипты включают в себя и путь, определенный с дорожками для индекса MSVC. Удаление их помогло.

C/ а также clang, у меня есть несколько версий msvc, установленных на моей машине. Лязг стали собирать на MSVC14, в то время как fastbuild пытался заставить clang использовать MSVC 12. Изменив fastbuild на MSVC14, я наконец-то смог преодолеть проблему с внутренними компонентами.

Встроенные функции не должны быть вызовами функций, они должны быть встроены в одну или несколько инструкций. Или, в некоторых случаях, никаких инструкций (например, барьер памяти компилятора, как c++'S std::atomic_signal_fence).

MSVC и GNU C являются отдельными разновидностями C. clang реализует GNU C, а AFAIK не поддерживает встроенные компоненты MSVC.

Когда есть GNU C __builtin_something, эквивалентный встроенному MSVC, используйте его через функцию-оболочку.

Mingw-w64, по-видимому, поддерживает _Interlocked???, через <winnt.h>. это сообщение списка рассылки является патчем, который переключил реализацию от встроенных asm к функциям GNU C __sync_fetch_and_???. IDK, если это доставка с текущим mingw,или если есть версия clang mingw. Но это то, что вы должны искать. Я уверен, что вы не первый человек, который хочет скомпилировать кодовую базу MSVC с помощью другого компилятора.