C++ 11允许inline namespaces,其所有成员也自动在封闭中namespace.我想不出任何有用的应用 - 有人可以给出一个简短,简洁的例子,说明inline namespace需要哪种情况以及最常用的解决方案?
(另外,当发生了什么并不清楚,我namespace声明inline在一个但不是所有的声明,这可能住在不同的文件.这难道不是找麻烦?)
在线上的大多数资源都指出您可以静态链接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)
这些消息来源很少(或从来没有)说过为什么这不是一个好主意。
我试图在一些旧的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中的任何新内容.
问题:
我在我的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 ++?
提前致谢!
众所周知,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 ++版本,它会很有用.
我们正在构建一个针对 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 版本的信息提供给应用程序吗?
我一直在使用 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) 我正在进行一些研究,并希望编辑libstdc ++库中的一些源代码进行实验.具体而言,我对试验并行排序算法感兴趣.有没有一个地方我可以找到文档来轻松编辑和构建源代码?
我试过构建各种版本的libstdc ++库,但没有成功.似乎大多数新版本都需要构建整个gcc包,这是一个更漫长的过程,特别是如果我要编辑和试验libstdc ++中的一些文件.
我也一直无法找到包含并行排序算法的源文件.我似乎只能找到定义函数的头文件,而不是源代码本身.任何建议或文档链接将不胜感激.
以下程序崩溃:
#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++编写的同一个库的版本.我需要并排比较它们.这些库使用相同的命名空间,函数名称并使用相同的参数.
当我同时链接两个或多个库时,是否有任何方法可以控制我使用的库版本?
我使用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)