我正在运行 CentOS 6.4 并且需要更高版本的 C++ 编译器来构建我的开发工具(在本例中为 Qt Creator)。
我不清楚使用 devtools 的含义,我希望有人能解释一下。
考虑以下代码:
#include <iostream>
#include <string>
#include <map>
using namespace std;
class Foo
{
public:
Foo() : _x(0)
{
cout << "Default" << endl;
}
Foo(int a) : _x(a)
{
cout << "Param" << endl;
}
Foo(Foo const &foo) :
_x(foo._x)
{
cout << "Copy" << endl;
}
Foo& operator=(Foo const &foo)
{
cout << "Assignment" << endl;
_x = foo._x;
return *this;
}
int get(void)
{
return _x;
}
private:
int _x;
};
int main(int argc, char *argv [])
{ …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习 C++ 课程,并使用 MinGW 进行编译(我开始做 K&R,所以已经为 C 设置了它)。每当我编译包含或使用任何库的文件时,都会出现以下错误:
“程序入口点...(这只是一个看起来很长的打乱的东西)无法位于动态链接库中...(我正在编译的文件的路径)”
谷歌搜索后,我尝试将 libstdc++-6.dll 放在 C:\Windows\System32 中,将 C:\MinGW\bin 作为 PATH 中的第一优先级,并将 libstdc++-6.dll 放在与 .cpp 文件相同的文件夹中我正在编译。
唯一的解决方案是将其复制到我正在编译的 .cpp 文件的文件夹中,但我希望避免以后每次都这样做。
先谢谢您的帮助!
我读过您可以在 Windows 上将 Clang 用于 C++ 应用程序,同时使用 C++ 标准库的 MS 实现。但是如果你想在 Windows 上使用 libc++,你目前需要使用类似 cygwin 或 mingw 的东西。我还看到了一些旧帖子,表明有人正在努力将 libc++ 移植到 Windows,但我找不到有关这项工作状态的任何信息。
也感谢有关类似努力/项目的任何信息。
今天我发现了一个有趣的双libstdc ++ ABI案例,影响了库的兼容性.
长话短说,我有两个库都在内部使用std :: regex.一个是使用CXX11 ABI构建的,另一个不是.当这两个库在一个可执行文件中链接在一起时,它会在启动时崩溃(在main输入之前).
库是不相关的,不公开提及任何std::类型的接口.我认为这些库应该不受双重ABI问题的影响.显然不是!
这个问题可以通过这种方式轻松复制:
// file.cc
#include <regex>
static std::regex foo("(a|b)");
// main.cc
int main() {}
// build.sh
g++ -o new.o file.cc
g++ -o old.o file.cc -D_GLIBCXX_USE_CXX11_ABI=0
g++ -o main main.cc new.o old.o
./main
Run Code Online (Sandbox Code Playgroud)
输出是:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
无论我做什么,问题仍然存在.file.cc可以制作成两个独立的源文件,编译成单独的共享库,这两个std::regex对象可能有不同的名称,它们可以是全局的,静态的或自动的(main从那时起需要调用相应的函数).这些都没有帮助.
显然(这是我的简短调查的结果)libstdc ++正则表达式编译器有一些存储的内部静态数据,std::string当两个ABI不兼容的代码片段试图使用该数据时,它会对std::string对象的布局产生冲突的想法.
所以我的问题是:
这个问题在g ++/libstdc ++的几个版本中是可重现的(我尝试了一些从5.4到7.1).libc ++不会出现这种情况.
我正在尝试将应用程序升级到C ++ 17并收到以下编译器错误:
error: ‘__BEGIN_NAMESPACE_STD’ does not name a type
Run Code Online (Sandbox Code Playgroud)
我正在使用gcc(GCC)8.2.0并使用以下命令进行编译:
g++ -std=c++17 variant.cpp -o variant
Run Code Online (Sandbox Code Playgroud)
这是一个小测试程序:
#include <iostream>
#include <variant>
using v_t = std::variant<int, double>;
int main(int argc, char const* argv[]) {
v_t foo = 5;
printf("foo contains %d\n", *std::get_if<int>(&foo));
std::cout << "Success" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误(如下)。请注意,如何在stdlib.h中启用__BEGIN_NAMESPACE_STD讨论了类似的问题,但是建议的解决方案(包括C ++头文件,而不是诸如stdlib.h之类的C头文件)是我已经在做的事情。
我能够在OSX便携式计算机上编译此代码,可能是因为默认情况下安装了更新的libc。但是,当我在Linux机器上运行时,出现这些错误。在Linux机器上,我正在使用以下链接器/ glibc版本:ldd (Ubuntu EGLIBC 2.19-0ubuntu6.14) 2.19
我正在继续调试,但是希望有朝正确方向发展的指针。
In file included from /toolchains/gcc-8.2.0/include/c++/8.2.0/cstdlib:75,
from /toolchains/gcc-8.2.0/include/c++/8.2.0/ext/string_conversions.h:41,
from /toolchains/gcc-8.2.0/include/c++/8.2.0/bits/basic_string.h:6391,
from /toolchains/gcc-8.2.0/include/c++/8.2.0/string:52,
from /toolchains/gcc-8.2.0/include/c++/8.2.0/bits/locale_classes.h:40,
from /toolchains/gcc-8.2.0/include/c++/8.2.0/bits/ios_base.h:41,
from /toolchains/gcc-8.2.0/include/c++/8.2.0/ios:42,
from /toolchains/gcc-8.2.0/include/c++/8.2.0/ostream:38, …Run Code Online (Sandbox Code Playgroud) 考虑这个最小的例子:
#include <filesystem>
#include <iostream>
int main()
{
std::cout << std::filesystem::current_path() << '\n';
}
Run Code Online (Sandbox Code Playgroud)
它在 GCC 9.2 中按预期工作,但 Clang 8.0.1 拒绝编译<filesystem>头文件(来自 GCC 9.2 的 libstdc++):
# clang++ 1.cpp -std=c++17
In file included from 1.cpp:1:
In file included from Z:\Lander\msys2\mingw64\include\c++\9.2.0\filesystem:37:
Z:\Lander\msys2\mingw64\include\c++\9.2.0\bits/fs_path.h:636:31: error: invalid use of incomplete
type 'std::filesystem::__cxx11::filesystem_error'
_GLIBCXX_THROW_OR_ABORT(filesystem_error(
^~~~~~~~~~~~~~~~~
Z:\Lander\msys2\mingw64\include\c++\9.2.0\x86_64-w64-mingw32\bits/c++config.h:177:49: note: expanded
from macro '_GLIBCXX_THROW_OR_ABORT'
# define _GLIBCXX_THROW_OR_ABORT(_EXC) (throw (_EXC))
^~~~
Z:\Lander\msys2\mingw64\include\c++\9.2.0\bits/fs_fwd.h:61:9: note: forward declaration of
'std::filesystem::__cxx11::filesystem_error'
class filesystem_error;
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
它是 Clang 错误还是 libstdc++ 错误? …
我正在尝试reticulate使用 RStudio Server v1.2.5042 以及使用conda. 当我使用 启动 Python 作业时reticulate,出现错误,指出某些系统库的版本不正确,特别libstdc++.so.6是 和libz.so.1。
首先,我意识到 CentOS 7.8 有点旧,一些问题可以通过升级操作系统来解决,但在这种情况下这不是一个选择。
该conda环境确实有效,我可以在终端窗口中运行目标 Python 脚本,不会出现任何错误。在RStudio中使用reticulate,此时代码非常简单:
library(reticulate)
use_condaenv('test')
py_run_file('test_script.py')
Run Code Online (Sandbox Code Playgroud)
当脚本运行时,我收到以下错误:
ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/<user>/.conda/envs/test/lib/python3.8/site-packages/scipy/_lib/_uarray/_uarray.cpython-38-x86_64-linux-gnu.so)
当我查看/usr/lib64目录时,我发现libstdc++.so,但运行strings libstdc++.so | grep ^GLIBC | sort显示它确实不支持 version GLIBCXX 3.4.21。没有什么惊喜。如果我导航到该/home/<user>/.conda/envs/test/lib目录,我会找到另一个副本libstdc++.so.6,并且这个副本确实支持 version GLIBCXX 3.4.21。因此,正确的环境目录中存在正确版本的库conda,但由于某种原因 RStudioreticulate找不到它。
我尝试更改LD_LIBRARY_PATH为conda首先列出环境目录,但这不起作用。我在这里 …
到目前为止,在我看来,在 C++ 模块接口中包含几乎所有 libstdc++ 标头都会导致 clang 14.0.0 和与 GCC 11.2.0 捆绑在一起的 libstdc++ 出现编译错误。我想知道我是否做错了什么,或者这是否还不受支持。(我发现Clang 模块支持是“部分”的,但无法找到已实现的内容和未实现的内容。)
这是一个简单的模块示例,我在 Linux 中使用 clang-14,并与 libstdc++ 链接。它演示了 libstdc++ 标头可以在模块实现中使用,但此示例未在模块接口中 #include 任何内容:
// mod_if.cc
export module mod;
export int foo();
// mod.cc
module;
#include <iostream>
module mod;
int foo() {
std::cout << "Hello world from foo()" << std::endl;
return 42;
}
// use.cc
import mod;
#include <iostream>
int main() {
std::cout << foo() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这有效:
$ CXXFLAGS="-std=c++20 -fmodules -fprebuilt-module-path=prebuilt"
$ …Run Code Online (Sandbox Code Playgroud) libstdc++ ×10
c++ ×9
clang ×3
c++11 ×2
abi ×1
c++-modules ×1
c++17 ×1
conda ×1
devtoolset ×1
g++ ×1
gnu ×1
libc++ ×1
libraries ×1
mingw ×1
python ×1
r ×1
redhat-dts ×1
reticulate ×1
windows ×1