我知道如何在Unix-ish上下文中链接库:如果我正在使用.a或.so文件,我指定根搜索目录-L/my/path/to/lib/和我添加的libMylib -lMyLib.
但是,如果我有
.dll(例如在Windows\System32目录中)?.dll(in Windows\System32)和a .lib(其他地方)?这些DLL是由其他一方提出的; 我无法访问他们的源 - 但是可以访问相应的包含文件,我可以根据这些文件进行编译.
我们用
x += y
Run Code Online (Sandbox Code Playgroud)
代替
x = x + y
Run Code Online (Sandbox Code Playgroud)
*,/,-和其他运营商类似.那么,那怎么样
x min= y
Run Code Online (Sandbox Code Playgroud)
代替
x = std::min(x, y)
Run Code Online (Sandbox Code Playgroud)
?这个命令是否有一个常用的习惯用法,不需要用另一个操作符(不可能)扩展该语言?
是否可以在运行时选择性地打开/关闭-ffast-math?例如,使用公共基类Math创建类FastMath和AccurateMath,以便一个人能够在运行时使用这两个实现?将次正常闪烁归零等同样如此.
特别是,我不知道使用-ffast-math进行编译是否会发出一条指令,该指令一旦执行就会影响线程中的所有数值计算(例如,设置一个标志以将subnormals刷新为零).
当我使用make uninstall它卸载一个应用程序时,会留下一些make install已经创建的空目录,例如/usr/share/foo/和它的子目录/usr/share/foo/applications等等.
我通过Google发现,automake生成的uninstall目标不会自动删除空目录,因为它不知道应用程序是否拥有目录(例如,它是否在其中创建make install),或借用它(例如,存在期间的目录make install).
目前我的make文件都没有确定的uninstall目标,隐式似乎知道它必须删除哪些文件.如何教它还删除有问题的文件夹?
我开始写一些 CUDA 代码,我想对std::swap()内核中的两个变量做等价的;它们在寄存器文件中(没有溢出,不在某些缓冲区中,等等)。假设我有以下设备代码:
__device__ foo(/* some args here */) {
/* etc. */
int x = /* value v1 */;
int y = /* value v2 */;
/* etc. */
swap(x,y);
/* etc. */
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以写
template <typename T> void swap ( T& a, T& b )
{
T c(a); a=b; b=c;
}
Run Code Online (Sandbox Code Playgroud)
但我想知道 - 不是有一些内置的 CUDA 用于此功能吗?
笔记:
我是Cuda的新手,我有以下功能:
__global__ void square(float *myArrayGPU)
{
myArrayGPU[threadIdx.x] = sqrt(threadIdx.x);
}
Run Code Online (Sandbox Code Playgroud)
我想使用cuda数学库,我试过,#include "math.h"但我仍然得到错误
error: calling a __host__ function("__sqrt") from a __global__ function("square") is not allowed
知道我应该包含哪些库来使用sqrt?
cppreference页面上std::setbase写着:
除8,10或16之外的基数值将基址重置为零,这对应于十进制输出和前缀相关的输入.
怎么会?
有没有特别的理由为什么只支持这些基地?至少支持16到16(实际上,高达36:0-9然后是az)的任何东西似乎微不足道,而不必做出任何困难的选择.具体来说,2是一个受欢迎的基础,我认为应该有兴趣std::setbase(2)(和相应的std::binary).
我显然可以打印自己的位,但对我的ostream来说这样做会很好.
一个std::optional<T>可以被初始化到像这样的分离状态:
std::optional<int> oi { nullopt };
Run Code Online (Sandbox Code Playgroud)
但也像这样:
std::optional<int> oi { };
Run Code Online (Sandbox Code Playgroud)
并且类似地用于分配(oi = {}或oi = nullopt).
除了个人偏好/美学意义之外,这些之间是否存在差异,这应该让我更喜欢一个?或者根本没关系?
注意:我问的是我想要显式初始化可选项的情况,而不是默认初始化它(例如强调).
我有一个 CMake 项目,同时构建了一个静态库并将其与其他代码链接到一个可执行文件中。由于我不会讨论的原因,我希望此链接与--whole-archive链接器标志一起发生。
现在,这个标志很棘手,因为你不能把它添加到任何地方——你必须切换它,然后列出你想要它应用的库,然后取消它。
我在某处读过(URL 使我无法理解),如果您有一个预先存在的库,您可以通过执行以下操作有效地添加此链接器标志:
# Just an example, find_library calls should really be isolated to separate find modules
find_library(FOO_LIBRARY foo)
set(FOO_LIBRARY "-Wl,--whole-archive ${FOO_LIBRARY} -Wl,--no-whole-archive")
add_executable(hello main.c)
target_link_libraries(hello ${FOO_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
没关系。但是,如果它是您正在构建的静态库,而您没有预先存在的变量(即您有add_library()CMake 命令的变量),该怎么办?您是否必须手动指示其路径而不是 ${FOO_LIBRARY}?或者是否有其他一些技巧可以用来获取 CMake 在命令行中放置的路径?
此外,如果我要使用某种类似${FOO_LIBRARY}字符串而不是我的静态库目标标识符 - 我相信 CMake 可能会错过依赖项,即它可能不会与修改后的库重新链接(甚至不会构建它),因为 target_link_libraries命令将看到一个奇怪的字符串,而不是另一个目标的标识符。
In his Meeting C++ 2019 talk (and also in 2018), presenter Deniz Bahadir recommends that we specify targets' C++ header files using target_sources(), with some of them being PUBLIC or INTERFACE.
But - when I try to do that (using relative paths, like I used to with the good old add_target()), I get this kind of error:
CMake Warning (dev) at CMakeLists.txt:26 (target_sources):
Policy CMP0076 is not set: target_sources() command converts relative paths
to absolute. Run "cmake --help-policy …Run Code Online (Sandbox Code Playgroud)