首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C++和clang在Windows上构建一个简单的CMake项目

使用C++和clang在Windows上构建一个简单的CMake项目
EN

Stack Overflow用户
提问于 2019-11-17 12:41:22
回答 4查看 10.8K关注 0票数 6

我试图得到一个简单的'Hello‘程序来构建在Windows 10上,最好使用CMake和clang。如果我使用来自g++的MinGW编译器,我可以成功地编译、链接和运行相同的项目,但是当我尝试使用clang++时会出现问题。

我的路径中已经安装和访问了CMake、MinGW和LLVM:

代码语言:javascript
运行
复制
clang++
clang++: error: no input files
代码语言:javascript
运行
复制
cmake --version
cmake version 3.16.0-rc1

我已经为CMake设置了使用clang的环境变量:

代码语言:javascript
运行
复制
echo %CC%
C:\Program Files\LLVM\bin\clang.exe
echo %CXX%
C:\Program Files\LLVM\bin\clang++.exe

现在,当我使用简单的"Hello“C++项目运行cmake时,cmake抱怨无法使用clang:

代码语言:javascript
运行
复制
cmake -G "MinGW Makefiles" ..
-- The CXX compiler identification is Clang 9.0.0 with GNU-like command-line
-- Check for working CXX compiler: C:/Program Files/LLVM/bin/clang++.exe
-- Check for working CXX compiler: C:/Program Files/LLVM/bin/clang++.exe -- broken
CMake Error at C:/Program Files/CMake/share/cmake-3.16/Modules/CMakeTestCXXCompiler.cmake:53 (message):
  The C++ compiler

    "C:/Program Files/LLVM/bin/clang++.exe"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: C:/Users/pball/git/bchest/build/CMakeFiles/CMakeTmp

    Run Build Command(s):C:/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/mingw32-make.exe cmTC_838da/fast && C:/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/mingw32-make.exe -f CMakeFiles\cmTC_838da.dir\build.make CMakeFiles/cmTC_838da.dir/build
    mingw32-make.exe[1]: Entering directory 'C:/Users/pball/git/bchest/build/CMakeFiles/CMakeTmp'
    Building CXX object CMakeFiles/cmTC_838da.dir/testCXXCompiler.cxx.obj
    C:\PROGRA~1\LLVM\bin\CLANG_~1.EXE    -g -Xclang -gcodeview -O0 -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd   -o CMakeFiles\cmTC_838da.dir\testCXXCompiler.cxx.obj -c C:\Users\pball\git\bchest\build\CMakeFiles\CMakeTmp\testCXXCompiler.cxx
    Linking CXX executable cmTC_838da.exe
    "C:\Program Files\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\cmTC_838da.dir\link.txt --verbose=1
    C:\PROGRA~1\LLVM\bin\CLANG_~1.EXE -fuse-ld=lld-link -nostartfiles -nostdlib   -g -Xclang -gcodeview -O0 -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd    @CMakeFiles\cmTC_838da.dir\objects1.rsp  -o cmTC_838da.exe -Xlinker /implib:cmTC_838da.lib -Xlinker /pdb:C:\Users\pball\git\bchest\build\CMakeFiles\CMakeTmp\cmTC_838da.pdb -Xlinker /version:0.0  @CMakeFiles\cmTC_838da.dir\linklibs.rsp
    lld-link: error: could not open 'kernel32.lib': no such file or directory
    lld-link: error: could not open 'user32.lib': no such file or directory
    lld-link: error: could not open 'gdi32.lib': no such file or directory
    lld-link: error: could not open 'winspool.lib': no such file or directory
    lld-link: error: could not open 'shell32.lib': no such file or directory
    lld-link: error: could not open 'ole32.lib': no such file or directory
    lld-link: error: could not open 'oleaut32.lib': no such file or directory
    lld-link: error: could not open 'uuid.lib': no such file or directory
    lld-link: error: could not open 'comdlg32.lib': no such file or directory
    lld-link: error: could not open 'advapi32.lib': no such file or directory
    lld-link: error: could not open 'oldnames.lib': no such file or directory
    lld-link: error: could not open 'msvcrtd.lib': no such file or directory
    CLANG_~1: error: linker command failed with exit code 1 (use -v to see invocation)
    mingw32-make.exe[1]: *** [CMakeFiles\cmTC_838da.dir\build.make:88: cmTC_838da.exe] Error 1
    mingw32-make.exe[1]: Leaving directory 'C:/Users/pball/git/bchest/build/CMakeFiles/CMakeTmp'
    mingw32-make.exe: *** [Makefile:120: cmTC_838da/fast] Error 2

这是一个新安装的Windows 10 PC。它没有安装Visual或任何Microsoft开发工具。如果可能的话,我希望不必安装Visual,例如获得msvcrtd.lib。我现在使用的是VS代码,但这应该与正在使用的IDE无关。

我的问题是,除了LLVM、CMake和MinGW之外,我还需要安装什么来构建我的第一个简单的C++项目?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-11-17 21:22:14

如果我没记错的话,Clang默认尝试在Windows上使用MSVC的标准库,因为Clang自己的标准库还不能在Windows上工作。

如果您没有安装MSVC,这会导致问题。

最简单的解决方案是安装MSYS2并使用MSYS2 2的补丁Clang,默认情况下使用GCC的库。作为一个不错的奖励,MSYS2还推出了最新的GCC版本。

或者,您可以使用-target标志告诉Clang使用GCC的库。如果我没有记错,这是通过向编译器和链接器标志添加-target x86_64-w64-mingw32来完成的。

(如果它不起作用,试试-target x86_64-w64-windows-gnu,我不记得是哪一个了。如果使用的是32位编译器,则用x86_64替换为i686。)

票数 1
EN

Stack Overflow用户

发布于 2019-11-23 09:04:18

您丢失了链接器标志中的库。这些库可在以下位置找到:

代码语言:javascript
运行
复制
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17134.0\um\x86

您的系统上的确切路径可能会因操作系统版本等而有所不同,但我相信您有这样的想法。找到位置后,可以将路径添加到CMakeLists.txt文件中的编译器标志,例如,

代码语言:javascript
运行
复制
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xlinker /libpath:path_to_library")

见有关答复:

https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/784047

https://stackoverflow.com/a/48576249/811335

如何使用/libpath标志:

https://learn.microsoft.com/en-us/cpp/build/reference/libpath-additional-libpath?view=vs-2019

票数 5
EN

Stack Overflow用户

发布于 2020-07-12 07:21:56

为了迫使Clang使用自己的库而不是MSVC的库,在CMAKE_C(XX)_FLAGS中添加“CMAKE_C x86_64-w64-mingw32”。

当心:在CMake标识编译器之前,例如在CMake中的第一个C或C++项目定义之前(例如,在项目()调用之前),您必须这样做:

代码语言:javascript
运行
复制
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -target x86_64-w64-mingw32")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -target x86_64-w64-mingw32")

project(MyProject ...)

或者,您可以使用"-D“将其传递给命令行上的CMake。

用clang 10.0测试

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58900537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档