我有一个项目,其makefile使用GNU Make独有的功能.遗憾的是,我们必须支持的平台在运行时GNU make仍然不是默认值make.
我的一位同事被这种方式所困扰,当一个非GNU make实现无法正确构建我们的代码时(它将一个自动变量扩展为一个空字符串).我希望通过生成显式错误消息来防止再次发生这种情况.
我可以用什么Makefile来区分GNU make和非GNU make,打印一个明确的错误,然后退出?
我已经找到了一个解决方法,将我的真实makefile重命名为GNUmakefile,并放入一个小存根Makefile,但我宁愿更直接的东西.
Beta和Dan Molding的答案看起来非常简单,但在AIX 6.1上,make实现无法处理其中任何一个:
$ cat testmake
foo:
touch foo
ifeq ($(shell $(MAKE) -v | grep GNU),)
$(error this is not GNU Make)
endif
ifeq "${MAKE_VERSION}" ""
$(info GNU Make not detected)
$(error ${MIN_MAKE_VER_MSG})
endif
$ /usr/bin/make -f testmake
"testmake", line 5: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 6: make: 1254-055 Dependency line needs colon or double colon …Run Code Online (Sandbox Code Playgroud) §6.5.8\ 6(关于>,<,<=,> =)
如果表达式P指向数组对象的元素并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1比P大.在所有其他情况下,行为未定义.
上面的几节,§6.5.8,基本上解释了指针算法在数组上的预期工作.那int a[3]; int *p = a; int *q = &a[2]; //q-p == 3是有效的.但是,正如我上面读到的那样q > p是UB.
我错过了什么?
我试图弄清楚是否有可能std::unordered_map使用 Cuckoo Hashing、Hopscotch Hashing 和 Robin Hood Hashing 等技术构建现代 C++ 的合规、高效实现,这些技术允许非常紧凑的表、高负载因子并保持高性能。这些技术的特别之处在于,它们涉及潜在地移动一些元素来为其他元素腾出空间,而不仅仅是链接或探测直到找到一个开放的插槽(如在线性或二次探测中)或。
来自insert http://www.cplusplus.com/reference/unordered_map/unordered_map/insert/
迭代器有效性在大多数情况下,容器中的所有迭代器在插入后仍然有效。唯一的例外是当容器的增长迫使重新散列时。在这种情况下,容器中的所有迭代器都将失效。
如果插入操作后新容器的大小增加到超过其容量阈值(计算为容器的 bucket_count 乘以其 max_load_factor),则强制重新散列。
对 unordered_map 容器中元素的引用在所有情况下都保持有效,即使在重新哈希后也是如此。
而对于erase http://www.cplusplus.com/reference/unordered_map/unordered_map/erase/
只有迭代器和对被删除元素的引用无效。
其余不受影响。
[仅限 c++14] 保留未由操作删除的元素的相对迭代顺序。
其他引用在这两个操作中通常保持有效的要求似乎需要一个涉及驱逐的探测方案来处理表结构,该表结构将分配的节点与数组分开并指向它们。也许实现可以保留一个单独的元素数组,表中的条目可以索引到这些元素,以避免额外的动态分配,但这仍然增加了额外的间接性。有没有更有效的方法来满足这个要求?
insert即使在重新散列之后,元素引用仍然有效的要求似乎意味着即使对于链接或非移动开放寻址设计,也需要动态节点分配或类似上述间接数组的东西。那正确吗?
一般来说,标准所提出的要求是否unordered_map强制执行间接或哈希表实现中的其他某种低效率?
当我尝试编译一些代码(而不是我自己的代码)时,我得到一个C2589'(':'::'右侧的非法令牌
在这条线上:
maxPosition[0]=std::numeric_limits<double>::min();
Run Code Online (Sandbox Code Playgroud)
我想这是因为已经定义了一个min()宏,但为什么编译器没有从指定的命名空间而不是宏中获取min()?
当我尝试使用gdb来调试使用libtool构建的包的测试程序时,我发现了一个奇怪的问题.如果我运行libtool --mode=execute gdb .libs/libfoo.so并要求它列出某些函数list Bar::Baz的源代码,我会按预期获得源代码.如果我运行libtool --mode=execute gdb binary,我可以闯入Bar::Baz(),并在堆栈跟踪中查看其参数,但我没有得到源文件或行号,如下所示:
#7 0x018348e5 in Bar::Baz(Qux*, Quux*) () from /path/to/libfoo.so
^^^^^^^^^^^ <--- debug symbols are present!
Run Code Online (Sandbox Code Playgroud)
同样,如果我list Bar::Baz在调试可执行文件时尝试,我会得到
No line number known for 'Bar::Baz'.
Run Code Online (Sandbox Code Playgroud)
我已经确认二进制文件是链接的-g,我可以列出它的main功能,所以我知道存在一些调试信息.
当我说info sources,我得到了构建库的文件的完整列表,具有正确的绝对路径.当我说info shared,我得到正确的路径列出到目标文件,Yes在Syms列中有一个.
什么可能出错的其他想法,以及如何解决它?
编辑1:偶然地,我objdump -g在违规库上运行,并得到以下输出:
/path/to/foo.so.0.0.0: file format elf32-i386
objdump: /path/to/foo.so.0.0.0: no recognized debugging information
Run Code Online (Sandbox Code Playgroud)
这是令人惊讶的,因为objdump -h(我试图运行)列出了一堆.debug_*部分.该objdump手册也表明readelf …
这不是关于MPI的特定技术编码方面的问题.我是MPI的新手,并不想让我自己以错误的方式使用库,因此在这里发布问题.
据我所知,MPI是一个在分布式内存模型上构建并行应用程序的环境.
我有一个与Infiniband互连的系统,其唯一目的是进行一些非常耗时的操作.我已经打破了算法并行执行,所以我真的只使用MPI通过Infiniband在多个节点之间传输数据(中间步骤的结果),我相信可以简单地使用OpenIB来做.
我是以正确的方式使用MPI吗?还是我弯曲了系统的初衷?
我做了一些事情,并意识到我的评论有拼写错误,所以我git commit -m "xxx"再次输入,并更正了评论.
因此,我不能像git push所说的那样推动任何事情
Everything up-to-date
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)
我现在能做什么?
我有两个项目副本.一个使用CVS,另一个使用Git存储库.现在我对使用CVS的项目副本进行了更改,我希望这些更改也适用于我的Git存储库.如何从Git存储库中的CVS项目导入更改?是否有命令或内置机制来做到这一点?
我正在使用linux,我有两个在另一个线程中读/写的变量.偶尔(100ms),ThreadB读取变量的状态并执行某些操作.它基本上是一个while(1){ dosomething(); usleep(); }.我担心变量会被缓存而且永远不会更新.
什么是确保循环在优化后才能工作的最佳方法?我在想volatile应该做的工作,但我听说它有时不起作用.两个循环都不经常运行(10ms +).访问它们的最简单直接的方法是什么?我正在使用C++ 11
我有点不确定如何使用std::atomic<int>.我可以像普通的int变量一样使用它,它会按预期工作吗?
我不完全确定发生了什么,但由于某种原因,我的git存储库的主ref文件现在是空的.我们正在Dropbox上托管存储库,所以也许它与此有关..但现在我无法从中拉出来.它说:
Your configuration specifies to merge with the ref 'master' from the remote, but no such ref was fetched.
Run Code Online (Sandbox Code Playgroud)
Dropbox保留文件的版本,所以如果我回到以前版本的'master',它会说:
fatal: object 2d154f82e59a4156a5d3ea04a0617c243ae6dc3a is corrupted
fatal: The remote end hung up unexpectedly
Run Code Online (Sandbox Code Playgroud)
我该如何从中恢复?