【发布时间】:2016-07-05 07:44:41
【问题描述】:
我正在将大型代码库从使用 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);
}
通过 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:CONSOLE /OPT:NOICF /OPT:NOREF
IntrinsicsTest.obj:错误 LNK2019:函数中引用了未解析的外部符号 ___rdtsc _wmain ...\IntrinsicsTest.debug.Win32.exe
致命错误 LNK1120:1 个未解决的外部问题
【问题讨论】:
-
内在函数通常是编译器扩展,并且是非标准的,因此它们依赖于编译器。
-
你在用clang-cl吗? mingw-w64 铿锵? MS 铿锵声/C2?
-
"Clang --version" 给我:
clang version 3.8.0 (branches/release_38) Target: x86_64-pc-windows-msvc Thread model: posix InstalledDir: C:\Program Files\LLVM\bin -
你能修复编译器输出中的格式吗?我不确定这是否只是一个命令。并尝试使用
clang++,这样调用未声明的函数实际上是错误的。 -
这是由 fastbuild 分别调用的 3 个命令。希望编辑使这一点更清楚。我很确定如果不花费大量精力更改构建工具,我就无法使用 clang++,因为我们拥有 c 和 c++(以及程序集)的混合代码库。 clang 似乎很好地应对了两者之间的交换,而 clang++ 似乎从来没有编译为 c。
标签: c++ visual-c++ build clang intrinsics