小编Flo*_*ogo的帖子

使用较旧的libc进行编译(未找到版本`GLIBC_2.14')

我必须在当前的ubuntu(12.04)上编译程序.然后,该程序应使用具有较旧内核(2.6.18)的CentOS在集群上运行.不幸的是,我不能直接在集群上编译.如果我只是编译并复制程序而没有任何更改,我会收到错误消息"kernel too old".

我理解它的方式,其原因不是内核版本,而是用于编译的libc版本.所以我尝试编译我的程序动态链接集群中的libc并静态链接其他所有内容.

研究

在SO上已经有很多关于这方面的问题,但没有一个答案对我有用.所以这是我对该主题的研究:

  • 这个问题解释了内核过旧消息的原因
  • 这个问题类似,但更专业,没有答案
  • 这里提出的静态链接不起作用,因为集群上的libc太旧了.一个答案还提到使用旧的libc进行构建,但没有解释如何执行此操作.
  • 一种方法是在运行旧操作系统的VM中进行编译.这工作但很复杂.我还读到你不应该静态链接libc
  • 显然,是可以编译为不同的libc版本的选项-rpath,但是这并没有为我工作(见下文)

当前状态

我将以下文件从群集复制到目录中 /path/to/copied/libs

  • libc-2.5.so
  • libgcc_s.so.1
  • 的libstdc ++.so.6

并正在编译选项 -nodefaultlibs -Xlinker -rpath=/path/to/copied/libs -Wl,-Bstatic,-lrt,-lboost_system,-lboost_filesystem -Wl,-Bdynamic,-lc,-lstdc++,-lgcc_s

编译二进制文件的ldd输出是

mybin: /path/to/copied/libs/libc.so.6: version `GLIBC_2.14' not found (required by mybin)
mybin: /path/to/copied/libs/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mybin)
linux-vdso.so.1 =>  (0x00007ffff36bb000)
libc.so.6 => /path/to/copied/libs/libc.so.6 (0x00007fbe3789a000)
libstdc++.so.6 => /path/to/copied/libs/libstdc++.so.6 (0x00007fbe37599000)
libgcc_s.so.1 => /path/to/copied/libs/libgcc_s.so.1 (0x00007fbe3738b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe37bf3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe37071000)
Run Code Online (Sandbox Code Playgroud)

我对这个错误感到有些困惑,因为它使用了正确的路径(即集群中的libc),但仍然抱怨缺少glibc版本.在群集上运行ldd时,它返回not a dynamic executable并运行二进制文件会产生上述相同的两个错误.它看起来还包括其他库(linux-vdso.so.1,ld-linux-x86-64.so.2和libm.so.6).我也应该使用旧版本吗? …

linker gcc shared-libraries

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

srand(1)和srand(0)之间有什么区别

我刚刚发现了将srand(1)C(++)的PRNG重置为任何调用之前的状态srand(如参考文献中所定义)的困难方法.然而,种子0似乎做同样的事情,或者在任何调用之前的状态srand似乎都使用种子0.这两个调用之间有什么区别或者他们做同样事情的原因是什么?

例如这段代码(在Ideone上执行)

#include <stdio.h>
#include <stdlib.h>

int main() {
    for (int seed = 0; seed < 4; seed++ ) {
        printf( "Seed %d:", seed);
        srand( seed );
        for(int i = 0; i < 5; i++ )
            printf( "    %10d", rand() );
        printf( "\n");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

回报

Seed 0:    1804289383     846930886    1681692777    1714636915    1957747793
Seed 1:    1804289383     846930886    1681692777    1714636915    1957747793
Seed 2:    1505335290    1738766719     190686788     260874575     747983061
Seed …
Run Code Online (Sandbox Code Playgroud)

c c++ random srand

18
推荐指数
3
解决办法
8852
查看次数

使用cmake强制执行32位或64位构建的选项

我想提供一种方法,始终将我的目标构建为32位或始终为64位可执行文件,并且cmake独立于主机系统(为gcc添加"-m32"或"-m64"标志,不确定然而,如何为其他编译器做什么).

我可以想到三种方法,我应该使用哪种方法?

  1. 一个选项(-DUSE32bit = true)
  2. 工具链(-DCMAKE_TOOLCHAIN_FILE = 64bit.toolchain)
  3. 构建类型(-DCMAKE_BUILD_TYPE = release32)

在我的情况下,强制32位构建将是默认的,应该易于使用.强制64位构建对某些情况也很有用,并且不应该太难.使用主机系统的位宽很少对我的情况有意义,我不想支持它.

我在这里找到了一个相关的问题(使用CMake强制进行32位编译的正确方法),但答案主要是讨论如何完成它,而不是如何使其可配置.

c++ cmake 32bit-64bit

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

使用环境变量作为 cmake 选项的默认值

我想设置一个带有一些选项(标志和字符串)的 cmake 脚本。对于某些选项,我想使用环境变量作为默认值。基本上,我正在尝试模拟MY_OPTION ?= defaultMakefile 中的某些内容。我尝试了以下方法:

project (Optiontest)

option(MY_OPTION 
       "Documentation"
       $ENV{MY_OPTION}
       FORCE)

message("value: ${MY_OPTION}")
Run Code Online (Sandbox Code Playgroud)

我用以下方式调用它:

$ cmake -DMY_OPTION=ON .
value: ON
$ cmake -DMY_OPTION=OFF .
value: OFF
$ MY_OPTION=OFF cmake .
value: OFF
$ MY_OPTION=ON cmake .
value: OFF
Run Code Online (Sandbox Code Playgroud)

我的问题是最后一行也应该打开。

对于奖励业力:我实际上更喜欢三个级别的偏好。-DMY_OPTION如果给定,则应使用的值。如果不是,MY_OPTION则应使用设置的环境变量的值。如果这也未设置,则应使用常量。我想,我可以使用一堆嵌套的 if 语句并以某种方式检查变量是否已设置,但我不知道如何设置,我希望有更好的方法。

options cmake environment-variables

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

在具有子项目的项目中设置CMAKE_CONFIGURATION_TYPES的位置

假设我有一个项目有两个独立的子项目.如果我正确地理解了cmake,那么想法是让一个根CMakeLists.txt定义a project(...)然后使用add_subdirectory(...)包含子项目.每个子项目都有CMakeLists.txt自己的项目定义.这样,项目可以一起构建(使用根cmake文件),也可以单独构建(使用子项目cmake文件).

我现在想改变CMAKE_CONFIGURATION_TYPES.我应该在根目录CMakeLists.txt或每个子项目中执行此操作,还是两者都执行此操作?

在根中更改它意味着单独构建子项目将提供错误的配置类型; 其他选项会复制cmake代码.我想我在这里遗漏了一些东西.

cmake subproject

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

在Excel中舍入不同的数字

我需要一个公式,根据数字是数十,数百,数千,数十,数百万等不同来对数字进行舍入.我知道Excel中的基本舍入函数但不确定如何准确地执行此操作.

例子:

1 - 999 need to be rounded up to the nearest 10.
1.000 - 99.999 need to be rounded up to the nearest 100.
100.000 - 999.999 need to be rounded up to the nearest 1.000.
1.000.000 - 999.999.999 need to be rounded up to the nearest 100.000.
1.000.000.000 - 999.999.999.999 need to be rounded up to the nearest 1.000.000
Run Code Online (Sandbox Code Playgroud)

所有这一切都在单一的公式中,可以很容易地被复制下来.

任何帮助将不胜感激!

excel rounding

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

Visual Studio的Cmake生成器不设置CMAKE_CONFIGURATION_TYPES

CMake的常见问题其他 地方 建议检查CMAKE_CONFIGURATION_TYPES识别多配置生成.我发现了几个不起作用的问题(比如这个问题).问题似乎是变量未在第一次调用cmake时设置.

我测试了以下文件

cmake_minimum_required(VERSION 2.6)

if(CMAKE_CONFIGURATION_TYPES)
    message("Multi-configuration generator")
else()
    message("Single-configuration generator")
endif()

project(foo)
Run Code Online (Sandbox Code Playgroud)

并称它为这样

mkdir build
cd build
cmake -G "Visual Studio 12 2013" ..
Run Code Online (Sandbox Code Playgroud)

并得到了Single-configuration generator.

我应该如何区分当前的发电机是否支持多种配置?

cmake visual-studio

3
推荐指数
2
解决办法
2975
查看次数