在Windows上使用clang链接msvc内在函数时出现问题

Tek*_*ebo 2 c++ build clang intrinsics visual-c++

我正在交换一个大的代码库,从使用msvc到Windows产品的叮当声。该产品使用了大量的msvc编译器内在函数,例如_InterlockedOr等。如果我在Windows上使用clang构建了一个小的测试程序,它会构建,链接并运行良好,但是如果我从使用内在函数的产品中构建一个库,作为缺少的符号出现。

我尝试使用--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: %llu\n", r);
}
Run Code Online (Sandbox Code Playgroud)

但是通过fastbuild调用时无法链接: FBuild.exe -showcmds -clean IntrinsicsTest_debug_x86

clang.exe“ \ IntrinsicsTest.cpp” -D_WINDOWS -c -m32 -mfpmath = sse -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 :控制台/ OPT:NOICF / OPT:NOREF

IntrinsicsTest.obj:错误LNK2019:函数_wmain中引用的未解析的外部符号____rdtsc ... \ IntrinsicsTest.debug.Win32.exe

致命错误LNK1120:1个未解决的外部零件

Tek*_*ebo 5

我已经解决了这个问题。快速构建,clang和msvc交互的方式有多个因素。

a /在Windows上使用Clang时,无需指定“系统”包含。在我们的项目中,包含路径如下:

-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"
Run Code Online (Sandbox Code Playgroud)

xmmintrin的Clang版本声明内联函数内联,因此,如果使用此标头,则测试程序可以正常编译。Windows xmmintrin将内部函数声明为extern函数,因此该程序可以编译,但不会链接-msvc构建从中获取这些符号的位置现在不相关。

但是,即使使用clang包含路径优先,但当<intrin.h>包含任何内容时,它也会拉入Windows标头。

b / Fastbuild允许您为构建环境设置环境变量。我们的脚本具有使用msvc路径定义的INCLUDE和PATH。删除这些帮助。

c /和clang一样,我在计算机上安装了多个版本的msvc。Clang开始使用MSVC14,而fastbuild试图让clang使用MSVC12。通过将fastbuild更改为使用MSVC14,我终于能够解决内在问题。