我需要帮助.我有一个使用stdc ++的框架,比如std:string.现在,当我为IOS7创建新的应用程序时,由于stdc ++ lib的问题,链接此框架存在问题:
架构armv7的未定义符号"std :: basic_string,std :: allocator> :: _ Rep :: _ S_empty_rep_storage",引自...
我发现一些奇怪的事情,当我在这个应用程序中将Deplyment目标更改为ios6时,一切正常.使用ios7,我看到错误.
我已经在其他链接器标志中设置了标志:-lstdc ++
知道自己做错了什么吗?
我有以下代码:
#include <iostream>
#include <random>
int main() {
std::mt19937_64 rng(std::random_device{}());
std::cout << std::uniform_int_distribution<>(0, 100)(rng) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用valgrind它来描述它,但它说:
vex amd64->IR: unhandled instruction bytes: 0xF 0xC7 0xF0 0x89 0x6 0xF 0x42 0xC1
vex amd64->IR: REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0
vex amd64->IR: VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=0F
vex amd64->IR: PFX.66=0 PFX.F2=0 PFX.F3=0
==2092== valgrind: Unrecognised instruction at address 0x4cdc1b5.
==2092== at 0x4CDC1B5:std::(anonymous namespace)::__x86_rdrand() (random.cc:69)
==2092== by 0x4CDC321: std::random_device::_M_getval() (random.cc:130)
==2092== by 0x4009D4: main (random.h:1619)
Run Code Online (Sandbox Code Playgroud)
在多个实例之前:
--2092-- WARNING: Serious error when reading …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用文件系统.我有-std=c++11 -std=c++1y我的CMakeLists.txt.GCC版本是4.9.2.但是,我有一个错误:
/home/loom/MyProject/src/main.cpp:5:35: fatal error: experimental/filesystem: No such file or directory
#include <experimental/filesystem>
^
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
什么是正确的使用方式std::experimental::filesystem?
我在 Ubuntu 20.04 LTS 上使用 clang++ 10,-fsanitize-undefined-trap-on-error -fsanitize=address,undefined,nullability,implicit-integer-truncation,implicit-integer-arithmetic-value-change,implicit-conversion,integer
我的代码正在生成随机字节
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<uint8_t> dd(0, 255);
...
ch = uint8_t(dd(gen));
Run Code Online (Sandbox Code Playgroud)
最后一行导致消毒程序报告未定义的行为位于bits/random.tcc中
template<...> void mersenne_twister_engine<...>::
_M_gen_rand(void) {
const _UIntType __upper_mask = (~_UIntType()) << __r;
const _UIntType __lower_mask = ~__upper_mask;
for (size_t __k = 0; __k < (__n - __m); ++__k)
{
_UIntType __y = ((_M_x[__k] & __upper_mask)
| (_M_x[__k + 1] & __lower_mask));
_M_x[__k] = (_M_x[__k + __m] ^ (__y >> 1)
^ ((__y & 0x01) ? __a : 0)); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用别人的Makefile来编译一个非常简单的c ++库.makefile如下:
JNIFLAGS=-O2 -pthread -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux
all:
rm -f ../dist/libUtils.so
g++ $(JNIFLAGS) -c -m32 -o com_markets_utils_dates_NativeTime.o com_markets_utils_dates_NativeTime.cpp
g++ $(JNIFLAGS) -c -m32 -o DateUtil.o DateUtil.cpp
g++ -pthread -m32 -shared -fPIC -o ../dist/libUtils.so DateUtil.cpp
g++ -pthread -m32 -shared -fPIC -o ../dist/libNativeTime.so DateUtil.o com_markets_utils_dates_NativeTime.o
Run Code Online (Sandbox Code Playgroud)
这编译很好,但链接器抱怨:
...
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.a when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
collect2: …Run Code Online (Sandbox Code Playgroud) g ++ 4.7.2是否实现std::set::emplace,如C++ 11标准所定义并在此处记录?
我写了以下小测试用例:
#include <set>
#include <string>
struct Foo
{
std::string mBar;
bool operator<(const Foo& rhs) const
{
return mBar < rhs.mBar;
}
Foo(const std::string bar) : mBar(bar) {};
};
typedef std::set<Foo> Foos;
int main()
{
Foos foos;
foos.emplace(std::string("Hello"));
}
Run Code Online (Sandbox Code Playgroud)
在G ++ 4.7.2下,这无法编译:
[john.dibling@somewhere hacks]$ g++ -o main.o -std=c++0x -c main.cpp
main.cpp: In function ‘int main()’:
main.cpp:19:10: error: ‘Foos’ has no member named ‘emplace’
Run Code Online (Sandbox Code Playgroud)
也无法在IDEOne下编译,但它在MSVC 2012 Update 1下编译.
我有一个关于libstdc ++的问题.所以.
我安装了新版本的gcc并尝试编译c ++代码.编译工作,但当我尝试执行二进制文件(m5.opt是它的名字)时,我遇到以下错误:build/ALPHA_SE/m5.opt:/usr/lib64/libstdc++.so.6:version`GLIBCXX_3找不到.4.9'(build/ALPHA_SE/m5.opt要求).
我需要替换libstdc ++.所以?如果是这样,我在哪里可以下载我想要的版本?在GCC网站上,他们说libstdc ++现在是gcc的一部分.
我希望有人可以帮助我!我现在只在Linux上工作了4个月,所以对我来说一切都很新.
马克斯
海湾合作委员会:
我之前有过gcc 4.1.2,但是我下载了gcc 4.2.4.从untarred gcc-directory我执行"./configure"; "使"; "sudo make install".当我尝试使用gcc或g ++进行编译时,它的默认版本仍为4.1.2.为了解决这个问题,我更换了一些链接:
mv/usr/bin/gcc/usr/bin/gcc_bak
ln -s/usr/local/bin/gcc gcc
mv/usr/bin/g ++/usr/bin/g ++ _ bak
ln -s/usr/local/bin/g ++ g ++
GLIBC(++) - libstdc ++:
/
usr/lib64/libstdc + +.so.6
- > libstdc ++.so.6.0.8
/usr/local/lib/libstdc++.so - > libstdc ++.so.6.0.9
/ lib/libc.so.6 - > libc-2.5.so - > libc-2.5.so
Linux版本:
uname -a给出:Linux madmax 2.6.18-128.4.1.el5#1 SMP Tue Aug 4 12:51:10 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
我可以使用c ++ 11中的任何东西并期望编译的二进制文件在旧系统上运行吗?如何判断c ++ 11的哪些部分是libstdc ++的一部分.那么实际编译成二进制文件的是什么?也许我不完全理解这些事情是如何起作用的.c ++ 11是否会破坏ABI与旧库的兼容性?
清晰的一个例子:
假设我编译了一个使用auto的程序和基于for循环的新范围.这些东西看起来应该适用于具有旧c ++运行时的系统,因为它们分解为在这些机器上有效的c ++.但是,使用像regex这样的东西应该在旧系统上中断,因为它不会在运行时.
我还没有测试过我的理论,因为我无法访问兼容c ++ 11的编译器,而且我的谷歌搜索也没有用.
我需要从一个以空格分隔的人类可读文件中读取一系列数字并进行一些数学运算,但是我在读取文件时遇到了一些真正奇怪的内存行为。
如果我阅读数字并立即丢弃它们......
#include <fstream>
int main(int, char**) {
std::ifstream ww15mgh("ww15mgh.grd");
double value;
while (ww15mgh >> value);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的程序根据 valgrind 分配了 59MB 的内存,相对于文件的大小线性缩放:
$ g++ stackoverflow.cpp
$ valgrind --tool=memcheck --leak-check=yes ./a.out 2>&1 | grep total
==523661== total heap usage: 1,038,970 allocs, 1,038,970 frees, 59,302,487
Run Code Online (Sandbox Code Playgroud)
但是,如果我ifstream >> string改为使用然后使用sscanf来解析字符串,我的内存使用情况看起来更加正常:
#include <fstream>
#include <string>
#include <cstdio>
int main(int, char**) {
std::ifstream ww15mgh("ww15mgh.grd");
double value;
std::string text;
while (ww15mgh >> text)
std::sscanf(text.c_str(), "%lf", &value);
return …Run Code Online (Sandbox Code Playgroud) 我正在使用英特尔的C++编译器,它在Linux上依赖于GNU提供的libc.so和libstdc ++.所以.
这是我的问题.要访问一些最新的C++ 11功能,我需要使用随GCC 4.7或更高版本提供的libstdc ++.但是我坚持使用CentOS 6.4.
在CentOS 6.4上,GCC的原生版本是4.4.但是使用名为"SCL"的RedHat和名为"devtoolset-1.1"的软件包,我可以在"/ opt"下安装GCC 4.7.
我按照上面提到的方式设置了GCC 4.7,我可以使用更新的C++ 11功能.
所以这是我的问题:如果用户只使用GCC 4.4版本的libc.so/libstdc ++来运行我的程序,那么在库路径中,由于4.4和4.7版本之间的某些不匹配,我的程序是否存在错误风险那些图书馆?
如果存在潜在问题,我可以通过静态链接GCC 4.7的libc和libstdc ++版本来解决它吗?或者,如果/当我的代码动态加载的其他库获取系统范围的GCC 4.4软件包提供的旧的libc/libstdc ++时,是否为其他问题做好准备?