2016-03-18 4 views
2

Я обмениваюсь большой кодовой базой использованием msvc для clang для продукта Windows. В этом продукте используется большое количество встроенных компиляторов msvc, таких как _InterlockedOr и т. Д. Если я создаю небольшую тестовую программу, использующую clang на окнах, она строит, ссылки и работает просто отлично, но если я создам библиотеку из нашего продукта, которая использует встроенные функции, появляется как недостающий символ.Проблемы с связями msvc intrinsics с использованием clang на окнах

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

Я начал писать собственную библиотеку встроенных в сборку, которая интересна, но не обязательна.

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

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

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

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

clang.exe "\ IntrinsicsTest.cpp" -D_WINDOWS -c -m32 -mfpmath = сс -D_UNICODE -DUNICODE -fno-RTTI -fexceptions -E ... \ IntrinsicsTest.debug.Win32.lib

Lib .exe/NOLOGO /OUT:"...\IntrinsicsTest.debug.Win32.lib "" ... \ IntrinsicsTest.obj "... \ IntrinsicsTest.debug.Win32.exe

link.exe/NOLOGO/INCREMENTAL: NO /OUT:"...\IntrinsicsTest.debug.Win32.exe "" ... \ IntrinsicsTest.obj "-defaultlib: libcmt.lib -INCREMENTAL -MANIFEST/MACHINE: X86/SUBSYSTEM: CONSOLE/OPT: NOICF/OPT: NOREF

IntrinsicsTest.obj: ошибка LNK2019: неразрешенный внешний символ ___rdtsc, указанный в функции _wmain ... \ IntrinsicsTest.debug.Win32.exe

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

+2

Intrinsics обычно являются расширениями компилятора и нестандартными, поэтому они зависят от компилятора. –

+0

Вы используете clang-cl? mingw-w64 clang? MS clang/C2? – melak47

+0

"Clang --version" дает мне: 'лязг версия 3.8.0 (филиалы/release_38) Цель: x86_64-ПК-окна-MSVC Автор модели: InstalledDir POSIX: C: \ Program Files \ LLVM \ bin' – Teknogrebo

ответ

3

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

a С Clang on Windows нет необходимости указывать «система». В нашем проекте мы имели включать пути, как:

-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" 

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

Однако, даже если clang включает путь сначала, когда <intrin.h> включен ничем, он тянет в заголовок окна.

b/Fastbuild позволяет настроить переменные среды для сборки env. В наших сценариях INCLUDE и PATH определены пути msvc. Удаление этих помогло.

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

+0

А, это как-то объясняет, почему заголовки с прототипами могут существовать для вещей, которые должны быть внутренними. Прототипы могут помочь IDE и тому подобное, но, вероятно, сам компилятор MSVC уже имеет внутренние встроенные определения для них, поскольку gcc/clang имеет '__builtin_XYZ', предварительно определенный. –

1

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

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

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

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

+3

Clang на окнах отправляет свое собственное '' с большим количеством встроенных функций MSVC. Некоторые из них просто реализованы напрямую, некоторые сопоставлены с поддерживаемыми LLVM функциями (включая семейство '_Interlocked ???'), а некоторые просто объявлены (не уверены, что определения для них находятся в какой-то библиотеке или нет). – melak47

+0

Спасибо за ваши ответы, но это вроде как игнорирует основной вопрос моего вопроса. Clang on windows компилирует intvinsics msvc просто отлично, поскольку они включены в его intrin.h. Однако, если я вручную привяжу их, они появятся как недостающие символы. @ melak47. Я также полагаю, что определение находится в некоторой библиотеке, но я не могу узнать имя этой библиотеки. – Teknogrebo

+0

@Teknogrebo: С какими внутренними проблемами у вас проблема? Как я уже сказал в первом абзаце, большинство из них должно быть включено во время компиляции, поэтому компоновщик не является частью изображения. Если есть проблема времени соединения, это означает, что вы не получили правильных встроенных/встроенных определений для них. Может быть, отредактируйте свой вопрос с минимального примера функции, которая строит отлично в автономном исполняемом файле, но не как в библиотеке? Кажется, это то, что вы получаете. –