我在Mac OS X(10.8.2)下使用C++工作,最近我想出了使用C++ 11功能的需求,这些功能可以通过使用libc ++ stdlib的clang ++编译器获得.但是,我还需要使用一些针对libstdc ++编译和链接的遗留库(来自MacPorts).
在这样做时,我得到了链接错误,因为遗留库的标题使用,例如std::string,需要解决std::__1::basic_string(即,libc ++实现std::string)而不是std::basic_string实现.
有没有办法在开发中混合两个库(例如,通过使用一些预处理器标志?)
我有一些问题。
1) 什么是libc++和libstdc++?
2)它们之间有什么区别?
3)它们可以互换吗?
4)这是编译器应该实现的东西吗?
5) 我什么时候应该使用一个或另一个?
我<ext/atomicity.h>在构建包含OpenCV的项目时抱怨编译器错误.环境是针对iOS的Xcode 4.5.它为模拟器编译良好,但在为设备构建时失败.这是错误文本:
/Users/Nick/projects/ios/opencv2.framework/Headers/core/operations.hpp:65:16: fatal error: 'ext/atomicity.h' file not found
#include <ext/atomicity.h>
Run Code Online (Sandbox Code Playgroud)
我正在使用opencv2.framework,使用cmake构建,使用此处的说明.
使用该函数libc++版本的程序getline在从管道读取输入时将阻塞,直到管道缓冲区已满。
对于该函数的版本,情况并非如此:在此处,该函数将立即读取并在输入可用后立即返回一行输入。libstdc++getline
我应该期待libstdc++和之间的这种行为差异libc++吗?[ 编辑:我在这里不是要征求意见,我只是对管道不甚了解,也对实施C ++标准库的困难不甚了解。对我来说,这种行为差异肯定是令人惊讶的,但也许有人知道更好,可以向我保证这种差异是可以预料的,也许这只是一个实现细节?]
更重要的是,我该怎么做才能libc++像人一样libstdc++?也就是说,该getline函数不应等到管道缓冲区已满,而应在可用时立即返回一行输入。
参见下面的代码示例,该代码示例显示了如何读取和写入管道。
我怀疑问题不仅限于macOS,但我还没有clang可以用来测试的Linux开发系统。
打开三个壳,我们称它们为A,B和C。
在外壳A中:创建一个新文件pipe-test.cpp并从下面添加源代码。一次编译源代码,一次编译libstdc++一次libc++:
g++ -stdlib=libstdc++ -o pipe-test-libstdc++ pipe-test.cpp
g++ -stdlib=libc++ -o pipe-test-libc++ pipe-test.cpp
Run Code Online (Sandbox Code Playgroud)
在外壳A中:创建两个管道:
mkfifo input-pipe output-pipe
Run Code Online (Sandbox Code Playgroud)
libstdc++程序版本pipe-test-libstdc++ input-pipe output-pipecat output-pipecat >input-pipe一些 C++功能测试宏(例如__cpp_lib_three_way_comparison)需要包含头文件(例如<compare>)来测试它们。
这似乎很倒退,例如,也许我只想在我知道编译器支持它时才包含头文件(更准确地说,它使用的是编译器+std lib impl),例如,假设我有my_fancy_string_view并且我想将它定义为std::string_view如果std::string_view可用,但是检测是否std::string_view可用我需要包括<string_view>...
这只是此功能设计中的“错误/oopsie”,还是编译器未预定义所有功能测试宏的充分理由?我的猜测是可能允许混合 STL 实现,例如某些平台上的 clang 使用 gcc 的 std lib 实现,但我再次假设编译器知道他们使用什么 std lib 实现,因此他们可以调整预定义的宏。
我知道<version>标头存在,但这对我没有帮助,因为它仅在 C++20 中添加。当我的基线是 C++20 时,它可能在 10 多年后很好,但现在它不是那么有用。
此外,添加此标题的事实可能表明实际上需要“重”包含是一个错误,但我想就此获得专家意见。
PS这是添加的提案<version>,但它非常小,所以没有细节......