我必须在当前的ubuntu(12.04)上编译程序.然后,该程序应使用具有较旧内核(2.6.18)的CentOS在集群上运行.不幸的是,我不能直接在集群上编译.如果我只是编译并复制程序而没有任何更改,我会收到错误消息"kernel too old".
我理解它的方式,其原因不是内核版本,而是用于编译的libc版本.所以我尝试编译我的程序动态链接集群中的libc并静态链接其他所有内容.
研究
在SO上已经有很多关于这方面的问题,但没有一个答案对我有用.所以这是我对该主题的研究:
-rpath,但是这并没有为我工作(见下文)当前状态
我将以下文件从群集复制到目录中 /path/to/copied/libs
并正在编译选项 -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).我也应该使用旧版本吗? …
我刚刚发现了将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) 我想提供一种方法,始终将我的目标构建为32位或始终为64位可执行文件,并且cmake独立于主机系统(为gcc添加"-m32"或"-m64"标志,不确定然而,如何为其他编译器做什么).
我可以想到三种方法,我应该使用哪种方法?
在我的情况下,强制32位构建将是默认的,应该易于使用.强制64位构建对某些情况也很有用,并且不应该太难.使用主机系统的位宽很少对我的情况有意义,我不想支持它.
我在这里找到了一个相关的问题(使用CMake强制进行32位编译的正确方法),但答案主要是讨论如何完成它,而不是如何使其可配置.
我想设置一个带有一些选项(标志和字符串)的 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 语句并以某种方式检查变量是否已设置,但我不知道如何设置,我希望有更好的方法。
假设我有一个项目有两个独立的子项目.如果我正确地理解了cmake,那么想法是让一个根CMakeLists.txt定义a project(...)然后使用add_subdirectory(...)包含子项目.每个子项目都有CMakeLists.txt自己的项目定义.这样,项目可以一起构建(使用根cmake文件),也可以单独构建(使用子项目cmake文件).
我现在想改变CMAKE_CONFIGURATION_TYPES.我应该在根目录CMakeLists.txt或每个子项目中执行此操作,还是两者都执行此操作?
在根中更改它意味着单独构建子项目将提供错误的配置类型; 其他选项会复制cmake代码.我想我在这里遗漏了一些东西.
我需要一个公式,根据数字是数十,数百,数千,数十,数百万等不同来对数字进行舍入.我知道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)
所有这一切都在单一的公式中,可以很容易地被复制下来.
任何帮助将不胜感激!
该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.
我应该如何区分当前的发电机是否支持多种配置?