相关疑难解决方法(0)

什么是内联命名空间?

C++ 11允许inline namespaces,其所有成员也自动在封闭中namespace.我想不出任何有用的应用 - 有人可以给出一个简短,简洁的例子,说明inline namespace需要哪种情况以及最常用的解决方案?

(另外,当发生了什么并不清楚,我namespace声明inline在一个但不是所有的声明,这可能住在不同的文件.这难道不是找麻烦?)

c++ namespaces c++11 inline-namespaces

320
推荐指数
6
解决办法
5万
查看次数

如何在普通C中启动线程?

我在C中使用了fork()来启动另一个进程.如何开始新线程?

c multithreading

49
推荐指数
5
解决办法
7万
查看次数

为什么不建议静态链接glibc?

在线上的大多数资源都指出您可以静态链接glibc,但不建议这样做。例如centos软件包repo

The glibc-static package contains the C library static libraries
for -static linking.  You don't need these, unless you link statically,
which is highly discouraged.
Run Code Online (Sandbox Code Playgroud)

这些消息来源很少(或从来没有)说过为什么这不是一个好主意。

c c++ linker glibc static-linking

36
推荐指数
2
解决办法
1520
查看次数

gcc:减少libc所需的版本

我试图在一些旧的32位RedHat发行版上运行一个新编译的二进制文件.
二进制文件在运行libc v2.12的CentOS 32位VM上编译为C(而不是++).

RedHat抱怨libc版本:

error while loading shared libraries: requires glibc 2.5 or later dynamic linker
由于我的程序相当简单,因此很可能不会使用libc中的任何新内容.

有没有办法减少libc版本要求

c linux linker gcc libc

18
推荐指数
2
解决办法
2万
查看次数

CMake:将libgcc和libstdc ++静态链接到共享库

问题:

我在我的Ubuntu 16.04安装上使用CMake和GCC4.9将glibcc/glibc ++链接到共享库时遇到问题.

附加条件:

加载共享库给出了Red Hat生产环境(我将其复制到)的问题,我相信因为它使用了不同的libstc ++版本(错误:找不到GLIBCXX_3_4_20).我没有sudo权限,无法升级机器.

正如我从这个博客派生的那篇文章,我尝试使用以下方法将静态链接与libgcc和libgc ++链接起来:

set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
Run Code Online (Sandbox Code Playgroud)

和使用

set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
Run Code Online (Sandbox Code Playgroud)

但这不起作用.什么的工作是这样的CMake的脚本:

add_library(myLib SHARED ${SOURCE_FILES})
set(CMAKE_EXE_LINKER_FLAGS " -static")
target_link_libraries(myLib -static-libgcc -static-libstdc++)
Run Code Online (Sandbox Code Playgroud)

这一定是错误的做法,据我所知-static-libgcc和-static-libstdc ++是链接器选项而不是库......

问题:如何正确地链接-libgcc和-libstdc ++?

提前致谢!

c++ gcc g++ cmake static-linking

16
推荐指数
2
解决办法
1万
查看次数

如何确定glibc(glibcxx)二进制的版本将取决于?

众所周知,glibc(以及据我所知,glibstd ++)也使用符号版本控制机制.(有关详细信息,请参阅: 如何链接到特定的glibc版本.)

问题是如何确定GLIBC和GLIBCXX的确切版本将由链接器为libc和libstdc ++中的名称选择?例如,如何得到这样的东西:

time -> time@GLIBC_2_5
...
gethostbyname -> gethostbyname@GLIBC_2_3
Run Code Online (Sandbox Code Playgroud)

我们为什么需要这个?在我看来,如果你想最小化所需的glibc/libstdc ++版本,它会很有用.

linux glibc libstdc++

7
推荐指数
1
解决办法
1万
查看次数

GLIBC:如何告诉可执行文件链接到特定版本的 GLIBC

我们正在构建一个针对 Ubuntu 18.04 LTS 和所有更高版本的 GTK3 应用程序。但是,当我们在 Ubuntu 20.04 版本中构建应用程序时,该应用程序无法在较旧的 Ubuntu 版本上运行。它说

libc.so.6:找不到版本“GLIBC_2.31”(.source 需要)

但如果我在 Ubuntu 18.04 上构建一个应用程序,它将适用于所有后续的 Ubuntu 版本。Ubuntu 18.04 默认情况下有 GLIBC 版本 2.27,该版本适用于所有后续版本。

那么有什么方法可以告诉我的应用程序,该应用程序是使用 GLIBC 2.27 构建的,无论构建该应用程序的操作系统是什么版本?有什么方法可以在构建过程中将 GLIBC 版本的信息提供给应用程序吗?

c unix linux glibc libc

7
推荐指数
1
解决办法
138
查看次数

如何在编译时删除“GLIBC_2.27”要求?

我一直在使用 docker 映像进行 c++ 编译。它基于 Ubuntu 18.04。当我尝试在某些 Ubuntu 16 系统上运行时,我收到以下消息:

/lib/x86_64-linux-gnu/libm.so.6:找不到版本“GLIBC_2.27”

我将在下面发布完整的 ldd 输出。我喜欢使用较新的编译器。我宁愿不使用较旧的 Linux 基础映像进行编译(但如果有必要我会这样做)。我静态链接了大多数库,但我还没有静态链接 glibc。许多网络资源建议不要这样做。有什么方法可以告诉我的新编译器(gcc 7.3)不需要新的 glibc?ldd -v 输出:

    linux-vdso.so.1 (0x00007ffd167cf000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007eff77399000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007eff77191000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007eff76df3000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007eff76bdb000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007eff767ea000)
    /lib64/ld-linux-x86-64.so.2 (0x00007eff79f90000)

    Version information:
    lbrycrd-linux (4)/lbrycrdd:
        ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        librt.so.1 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/librt.so.1
        libm.so.6 (GLIBC_2.27) => /lib/x86_64-linux-gnu/libm.so.6
        libm.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libm.so.6
        libgcc_s.so.1 (GCC_3.3) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libgcc_s.so.1 (GCC_4.2.0) => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libpthread.so.0 (GLIBC_2.3.4) => …
Run Code Online (Sandbox Code Playgroud)

gcc glibc dynamic-linking ldd

6
推荐指数
1
解决办法
1万
查看次数

如何编辑和重新构建GCC libstdc ++ C++标准库源代码?

我正在进行一些研究,并希望编辑libstdc ++库中的一些源代码进行实验.具体而言,我对试验并行排序算法感兴趣.有没有一个地方我可以找到文档来轻松编辑和构建源代码?

我试过构建各种版本的libstdc ++库,但没有成功.似乎大多数新版本都需要构建整个gcc包,这是一个更漫长的过程,特别是如果我要编辑和试验libstdc ++中的一些文件.

我也一直无法找到包含并行排序算法的源文件.我似乎只能找到定义函数的头文件,而不是源代码本身.任何建议或文档链接将不胜感激.

c++ parallel-processing gcc stl libstdc++

5
推荐指数
2
解决办法
3521
查看次数

当 filesystem::path 被破坏时程序崩溃

以下程序崩溃:

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
    fs::path p1 = "/usr/lib/sendmail.cf";
 
    std::cout << "p1 = " << p1 << '\n';
}
Run Code Online (Sandbox Code Playgroud)

汇编:

$ g++ -std=c++17 pathExistsTest.cpp
$ ./a.out 
p1 = "/usr/lib/sendmail.cf"
[1]    35688 segmentation fault (core dumped)  ./a.out

Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 20.04 上测试,编译器为 GCC 8.4.0。

Valgrind,这是切割输出:

==30078==    by 0x4AE5034: QAbstractButton::mouseReleaseEvent(QMouseEvent*) (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.12.8)
==30078==    by 0x4A312B5: QWidget::event(QEvent*) (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.12.8)
==30078==  Address 0x2b is not stack'd, malloc'd or (recently) free'd
==30078== 
==30078== 
==30078== Process terminating with default action …
Run Code Online (Sandbox Code Playgroud)

c++ libstdc++ c++17 std-filesystem

5
推荐指数
1
解决办法
894
查看次数

如何在2个不同的共享库中调用具有相同符号的函数?

我有几个用C++编写的同一个库的版本.我需要并排比较它们.这些库使用相同的命名空间,函数名称并使用相同的参数.

当我同时链接两个或多个库时,是否有任何方法可以控制我使用的库版本?

c++ shared-libraries qnx

4
推荐指数
1
解决办法
1179
查看次数

Ubuntu编译的程序在Unix webserver上运行

我使用GNAT在Ubuntu上编译了一个Ada程序.

之后,我尝试了一些使用该程序的测试,并且它运行正常.

但是,当我将其上传到我的Apache(UNIX)网络服务器并尝试运行该程序时,没有输出.为什么会这样?

可能是在Ubuntu上编译的程序在UNIX服务器上不起作用吗?

(抱歉这个愚蠢的问题!)

我用于编译的系统的Linux版本(uname -a):

Linux ubuntu 3.0.0-12-generic #20-Ubuntu x86-64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

系统的Linux版本我想稍后运行该程序(uname -a):

Linux 2.6.37-he-xeon-64gb+1 i686 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

为了在Ubuntu机器上进行编译,我使用:

gnatmake -O3 myprogram -bargs -static
Run Code Online (Sandbox Code Playgroud)

apache ubuntu gcc glibc ada

1
推荐指数
1
解决办法
838
查看次数