首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >clang / g++和libc++ /libstdc++之间的切换

clang / g++和libc++ /libstdc++之间的切换
EN

Stack Overflow用户
提问于 2017-04-27 16:04:43
回答 1查看 9.7K关注 0票数 5

这是我的第一个cmake文件。我有一个同时带有clang和g++的linux系统。此外,还安装了libc++。我在Mac (xcode)上开发,但部署到linux上。我正在写一个cmake文件,在这个文件中我可以选择clang或g++以及libc++或libstdc++。所以有4种可能的组合。

我知道如何选择编译器并在其上强制使用c++11,但是我不知道如何指定标准库。有什么建议吗?

这就是我到目前为止所知道的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## cmake ###
cmake_minimum_required (VERSION 3.5)

#set project directories
set(ProjectDirectory ${CMAKE_SOURCE_DIR}) #.../Project/
set(BuildDirectory ${ProjectDirectory}/Build)
set(ProductDirectory ${ProjectDirectory}/Products)
set(sourceDirectory ${ProjectDirectory}/Source)

#print project directories
message(${ProjectDirectory})
message(${BuildDirectory})
message(${ProductDirectory})

#configure cmake
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ProductDirectory})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${ProductDirectory})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ProductDirectory})

set(CMAKE_VERBOSE_MAKEFILE on)

#compiler and standard library settings
set(CMAKE_CXX_COMPILER "clang++")
set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v -stdlib=libc++")
        #libstdc++ #linux
        #libc++    #OS X

#compiler flags
SET( CompilerFlags  " ")
#SET( CompilerFlags  "${CompilerFlags} -stdlib=libc++" )
SET( CompilerFlags  "${CompilerFlags} -Wno-unknown-pragmas" )
SET( CompilerFlags  "${CompilerFlags} -Wall" )
SET( CompilerFlags  "${CompilerFlags} -Wextra" )

set (CMAKE_CXX_FLAGS ${CompilerFlags})

#linker flags
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi")

#message(${CMAKE_CXX_FLAGS})

##################
### Libraries ###
################
### common library ###
project(common)

#message(STATUS ${CMAKE_CXX_FLAGS})

#source files
#set (commonSource ${sourceDirectory}/Object/object.cpp) #specify specific files
file(GLOB_RECURSE commonSource ${sourceDirectory}/Object/*.cpp) # recursive

#targets
add_library (common STATIC ${commonSource})

#target_compile_options (common PUBLIC ${CompilerFlags})


#####################
### Applications ###
###################
### Hello project ###
project (hello)

#source files
#set (helloSource ${sourceDirectory}/main.cpp)

#targets
#add_executable (hello ${helloSource})

#linking
#target_link_libraries (hello common)


#install(TARGETS common DESTINATION ${ProductDirectory})

我在控制台上运行此命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
../Project/Build$ rm -r *; rm -r ../Products/*; cmake ..; make VERBOSE=1;

我的文件夹结构是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Project
    Source
    Build
    Products
    CMakeLists.txt

我还注意到编译器标志有时会被忽略,只在我第二次运行cmake和make时使用。

此外,我在代码中使用了大量的#warning todo,如何在编译期间禁用这些警告?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-29 03:02:02

这有点棘手,因为我不相信CMake有一种选择标准库的内置方法。我要做的就是把它传递给链接器标志。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi")

但是,CMake确实支持设置编译器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set(CMAKE_CXX_COMPILER "clang++")
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43662736

复制
相关文章
Mac Terminal如何支持C++11
原因是Mac自带的g++版本太低。 如果想使用C++11,可以用clang++替代g++,并用libc++替换libstdc++,因为libstdc++的版本也太老,不支持c++11
EltonZheng
2021/01/26
1.2K0
重写了llvm+clang+libc++和libc++abi的构建脚本
由于之前整理的服务器框架已经完成了,就需要用各种静态分析工具跑一遍。原来的llvm+clang的编译脚本是从GCC那个脚本copy过来然后改的,使用的时候各种问题。所以干醋重新折腾一遍,重写了。
owent
2018/08/01
2.2K0
从Xcode10不再支持libstdc++说起
众所周知从Xcode10起,苹果摒弃了对libstdc++库的支持转而支持libc++库了。这两个库在Xcode9甚至更早的版本就已经同时存在于系统中并且可供开发者选择,当然在Xcode9时代苹果就已经宣布了将要废弃libstdc++的信息了。
欧阳大哥2013
2018/11/09
2.2K0
深夜里安静的编译一个OpenJDK8,坑太多
http://static.cyblogs.com/QQ20200524-035223@2x.jpg
chengcheng222e
2021/11/04
1.4K0
LLVM+Clang+Libcxx+Libcxxabi(3.6)工具链编译(完成自举编译)
LLVM和Clang工具链的生成配置文件写得比较搓,所以略微麻烦,另外这个脚本没有经过多环境测试,不保证在其他Linux发行版里正常使用。
owent
2018/08/01
1.9K0
[C++20] Module partitions和符号交叉引用(声明和实现分离)
C++20 开始支持 Module 了。在以前C++为了解决循环依赖问题,经常会把类或者函数声明写前面,实现写后面。然后中间的代码就可以实现内部模块的内聚而互相引用。比如:
owent
2021/03/29
1.7K0
linux下gcc、g++不同版本的安装和切换
Ubuntu 18.04预装GCC版本为7.3,但有时在编译是需要用的不同gcc版本,下面介绍,如何安装不同的gcc 和g++,并设置根据不同的需要在不同版本之间切换。
foochane
2019/05/23
14.3K0
再度优化GCC、LLVM、Clang、libc++、libc++abi等套件的构建脚本
一直以来,我都维护了完整的 GCC 工具链构建工具 和 LLVM,Clang,libc++,libc++abi工具链构建工具 。 一方面是为了测试和体验新版本编译器的功能和利用一些更现代化的工具检查代码中的风险,另一方面也是为了给我得很多开源仓库做多版本适配。 其中所有的编译期依赖项(不包括 tar,awk等可执行程序的工具)都是自己构建的,这样也能管理好某些新版本组件需要的新版本依赖项,并且做到跨发行版兼容。同时很多发行版自带的 LLVM+Clang 套件都缺斤少两,有的缺少 clang-analyzer ,有的缺少 clang-format ,也有的缺少 libc++ 和 libc++abi 或者缺少sanitizer组件。我也是根据自己的需要编译并输出了大多数开发工具,甚至还有一些开发库以便二次开发(比如用libclang写工具来复用libcang的AST功能)。
owent
2023/03/06
3.3K0
再次重构LLVM+Clang+libcxx+libc++abi+其他相关工具的构建流程
我们有时候写一些基础性类库或者实验新功能的时候,常常需要使用到最新版本的GCC和Clang。一些Linux发行版的源里和一些工具链(比如MSYS2)里其实自带LLVM套件的包,LLVM 官网也提供一些常见平台的预编译包下载。 那为什么我们还要自己编译呢?如果有注意到的小伙伴可能会发现,很多平台的源和 LLVM 官网 里下载的预编译包,其实是缺失很多组件的。有些没有libc++和libc++abi(CentOS 8),有些没有Sanitizer相关的组件,有些缺失其他的组件。而Clang虽然支持GCC的libstdc++,但是一方面我们写基础性类库还是要优先考虑原生STL库的兼容性,另一方面Clang对libstdc++的支持也不是太好,特别是有些第三方库在这个组合下也是没有适配得很好,同时gdb和libc++的搭配有时候也不是很完善。 所以我们就需要一个组件尽可能开完整地包含LLVM,Clang,libc++,libc++abi还有其他周边工具(各类Sanitizer,clang-tiny,clang-analyzer等等)的工具链。
owent
2023/03/06
2.5K0
open toolchain on ubuntu 12.04
###ubuntu 12.04 安装llvm3.4、ios-lang交叉编译环境小记 在ubuntu 12.04上先安装gcc-4.8,然后安装llvm,clang,libcxx,libcxxabi.由于libcxx和libcxxabi相互依赖,需要两次安装libcxx。最后安装theos等开放的ios开发工具链 安装gcc-4.8如前文所述install gcc4.8 on ubuntu 12.04 安装llvm,clang /etc/apt/sources.list中添加如下两行:
pydata
2018/08/02
1.1K0
gcc和g++的区别
gcc 最开始的时候是 GNU C Compiler, 如你所知,就是一个c编译器。但是后来因为这个项目里边集成了更多其他不同语言的编译器,GCC就代表 the GNU Compiler Collection,所以表示一堆编译器的合集。 g++则是GCC的c++编译器。 现在你在编译代码时调用的gcc,已经不是当初那个c语言编译器了,更确切的说他是一个驱动程序,根据代码的后缀名来判断调用c编译器还是c++编译器 (g++)。比如你的代码后缀是*.c,他会调用c编译器还有linker去链接c的library。如果你的代码后缀是cpp, 他会调用g++编译器,当然library call也是c++版本的。 当然我说了这么多你可能感到有些混乱,没关系,你就把gcc当成c语言编译器,g++当成c++语言编译器用就是了。
bear_fish
2018/09/19
2.8K0
Xcode10 Pod第三方库找不到lstdc++ 6.0.9
苹果在XCode10和iOS12中移除了libstdc++这个库,由libc++这个库取而代之,苹果的解释是libstdc++已经标记为废弃有5年了,建议大家使用经过了llvm优化过并且全面支持C++11的libc++库。
星宇大前端
2019/01/15
9250
多个git账号之间的切换
做过很多遍了,却总是记不住,这回从头来描述一下。 介绍 所谓多个git账号,可能有两种情况: 我有多个github的账号,不同的账号对应不同的repo,需要push的时候自动区分账号 我有多个git的账号,有的是github的,有的是bitbucket的,有的是单位的gitlab的,不同账号对应不同的repo,需要push的时候自动区分账号 这两种情况的处理方法是一样的,分下面几步走: 处理 先假设我有两个账号,一个是github上的,一个是公司gitlab上面的。先为不同的账号生成不同的ssh-key
happy123.me
2018/06/04
2K0
GCC、Clang和LLVM
GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。
动动我试试
2020/03/12
1.1K0
通过休眠在 Linux 和 windows 之间无缝切换
Linux 电脑挂了一个 Windows 虚拟机,但是有些东西还得是真机才管用,比如 Windows 大型独占软件,或者备份国内某空间占用贼大但只要你一找文件它就告诉你文件已过期的社交软件的聊天记录。备份可以在虚拟机中完成,但是只能是电脑连接手机热点,速度太慢了咱没那时间。
网名重要么
2023/06/07
2.9K0
通过休眠在 Linux 和 windows 之间无缝切换
编译原理基础
GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。
嵌入式视觉
2022/09/05
8950
clang 源码导读(1): clang 入门
本系列文章会通过对 clang 源码进行拆解的方式,逐步对 clang 内部的各种逻辑进行介绍。
酷酷的哀殿
2021/03/18
5.2K0
clang 源码导读(1): clang 入门
linux下Clang和gcc的区别
出错提示更友 好,比如 clang 在编译过程可以直接指出相对简单的出错位置以及它 “ 认为 ” 正确的方式 。
Linux阅码场
2019/06/21
5.5K0
如何在Anaconda的python和系统自带的python之间切换
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Teeyohuang/article/details/79076821
TeeyoHuang
2019/05/25
4.1K0
C++为什么要弄出虚表这个东西?
首先回顾一下C语言纯POD的结构体(struct)。如果用C语言实现一个类似面向对象的类,应该怎么做呢?
果冻虾仁
2021/12/08
5300
C++为什么要弄出虚表这个东西?

相似问题

libc++和libstdc++之间的istream eof差异

40

用clang++/libc++删除libstdc++依赖项?

14

cmake检测哪个库libc++或libstdc++被配置为用于g++或clang++

112

什么是libc++和libstdc++?

21

在clang++ -stdlib=libc++中使用libstdc++编译库

1181
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文