由于以下警告:
CMake Error at test/CMakeLists.txt:29 (get_target_property):
The LOCATION property may not be read from target "my_exe". Use the
target name directly with add_custom_command, or use the generator
expression $<TARGET_FILE>, as appropriate.
Run Code Online (Sandbox Code Playgroud)
这是来自这样的行的结果:
get_target_property(my_exe_path my_exe LOCATION)
Run Code Online (Sandbox Code Playgroud)
像在文档中推荐的那样,我尝试使用这样的生成器表达式:
add_executable(my_exe_path main.cpp)
message("path to executable: $<TARGET_FILE:my_exe_path>")
Run Code Online (Sandbox Code Playgroud)
但是TARGET_FILE没有被评估
path to executable: $<TARGET_FILE:my_exe>
Run Code Online (Sandbox Code Playgroud)
我正在使用CMake 3.4并添加cmake_minimum_required(VERSION 3.4)到我的CMakeLists.txt所以我做错了什么?
zsh和bash标签完成之间存在令人讨厌的区别:
想象一下,你写了一些命令,并希望在行的开头添加一些东西:
$ compute --some --stuff
Run Code Online (Sandbox Code Playgroud)
然后你跳到行和行的开头并开始写sudo(坏的例子 - 只是为了演示)
$ sudcompute --some --stuff
^ <---cursor
Run Code Online (Sandbox Code Playgroud)
bash会让你完成sud,sudo同时zsh尝试完成 sudcompute.
因此,在这种情况下,您必须编写一个空格,跳回一个字符并尝试Tab-complete.
如果你仍然习惯了,bash你会尝试使用tab-complete sud并将你开始编写的命令渲染成完全没用的东西.
简而言之:是否可以选择让zsh光标左侧的短语完整,无论它是否以空格终止?
想象一下以下命令:
a = {'key1': {'subkey1': [1, 2, 3]}}
b = {'key1': {'subkey2': [1, 2, 3]}}
Run Code Online (Sandbox Code Playgroud)
我想合并它们以获得
c = {'key1': {'subkey1': [1, 2, 3],
'subkey2': [1, 2, 3]}}
Run Code Online (Sandbox Code Playgroud)
额外好的解决方案是返回深层副本a,b我可以在不更改a或的情况下进行更改b。
c = {**a, **b}
Run Code Online (Sandbox Code Playgroud)
看起来不错,但似乎与我的情况c = copy(a).update(b)返回的结果相同,因为被更新覆盖。bkey1
您当然可以像这样手动执行此操作(在另一个答案中找到):
def combine_dict(map1: dict, map2: dict):
def update(d: dict, u: dict):
for k, v in u.items():
if isinstance(v, collections.Mapping):
r = update(d.get(k, {}), v)
d[k] = r
else:
d[k] = u[k]
return d …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种独立于编程语言或集合类型来定义集合查询的方法。
详细来说,这将是 Java、C++、Python 等常见语言的语言定义和实现。
正如所评论的,我不是在寻找数据库或集合表示的任何实现,而只是寻找一种定义元素查询的方法,例如Pythonstd::set/vector或set()任何可以视为集合的线性结构。
一个类似的例子是jLinq之类的东西,但不依赖于 JSON 或 javascript,并且具有明确定义的字符串表示形式。
当然,如果不知道数据结构的类型,您就必须为每个问题和每种编程语言实现任何条件过滤器,但是构造查询字符串的方式以及如何评估它们将会很清楚,并且您不必编写解析器。
所以我想用 Java 或 C++ 编写类似于
q = query()
.created_after("14.03.2010")
.and(contains("hello")
.or(contains("hallo")))
.sort("caption")
Run Code Online (Sandbox Code Playgroud)
或写为字符串:
"(created_after("14.03.2010") and ( contains("hello") or contains("hallo"))) sort("caption")"
Run Code Online (Sandbox Code Playgroud)
(这没有经过深思熟虑 - 只是为了展示界面的外观)
JSON 或 XML 是解决不同问题的一个很好的例子:清晰的语言定义和适用于任何平台或编程语言的解析器/工具。
我在许多配置中使用Python和C++中的ZeroMQ,我想知道哪个是最优雅的方式来中止recv()或poll()从另一个线程中止(例如,在受控程序终止的情况下,但如果你想停止监听而不需要杀死它插座).
与这个问题相反,我不只是想避免不定式的等待,但我想立即从recv()或返回poll().
我知道我可以像这样提供timeout和中止recv():
poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)
while _running:
if poller.poll(timeout=100) == []:
# maybe handle unwanted timout here..
continue
handle_message(socket.recv())
Run Code Online (Sandbox Code Playgroud)
这将无休止地轮询插槽,直到从另一个线程_running设置为False- 在最多100毫秒之后我完成了.
但这并不好 - 我有一个繁忙的循环,这种方式很难处理可能由于不需要的行为导致的实际超时.此外,我必须等待超时,这在大多数情况下并不重要但是......你知道我的意思.
当然我可以轮询一个额外的插座用于堕胎:
abort_socket = context.socket(zmq.SUB)
abort_socket.setsockopt(zmq.SUBSCRIBE, b"")
abort_socket.connect(<abort-publisher-endpoint>)
poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)
poller.register(abort_socket, zmq.POLLIN)
while _running:
poll_result = poller.poll(timeout=1000)
if socket in poll_result:
handle_message(socket.recv())
elif abort_socket in poll_result:
break
else:
# …Run Code Online (Sandbox Code Playgroud) 我有一个很小的 Python 脚本,它(在我看来)threading.Thread.start()由于它不会立即返回而导致行为出乎意料。
在一个线程中,我想从一个boost::python不会立即返回的基于对象调用一个方法。
为此,我像这样包装对象/方法:
import threading
import time
import my_boostpython_lib
my_cpp_object = my_boostpython_lib.my_cpp_class()
def some_fn():
# has to be here - otherwise .start() does not return
# time.sleep(1)
my_cpp_object.non_terminating_fn() # blocks
print("%x: 1" % threading.get_ident())
threading.Thread(target=some_fn).start()
print("%x: 2" % threading.get_ident()) # will not always be called!!
Run Code Online (Sandbox Code Playgroud)
只要我在 my_cpp_object.non_terminating_fn(). 如果我不这样做,.start()将像.run()直接调用一样阻塞。
在调用boost::python函数之前只打印一行是不够的,但是例如打印两行或调用time.sleep()使start()按预期立即返回。
你能解释一下这种行为吗?我将如何避免这种情况(除了sleep()在调用boost::python函数之前调用)?
我猜答案似乎很明显,但https://superuser.com/questions/406141/how-to-get-an-arm-cpu-clock-speed-in-linux 中给出的所有可能答案都不适用于我。
cat /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)
只给我
processor : 0
model name : ARMv7 Processor rev 2 (v7l)
Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc08
CPU revision : 2
Hardware : Generic AM33XX (Flattened Device Tree)
Revision : 0000
Serial : 0000000000000000
Run Code Online (Sandbox Code Playgroud)
并且cpuinfo_*_freq下面没有调用文件 /sys/devices/system/cpu。我没有在这台机器上调用hwinfo或dmidecode或任何可执行文件cpu*:)
您知道如何以编程方式检索或“测量”CPU 的实际频率吗?
我使用CMake (3.4.1)根据Boost库构建了一个 C++ 项目。宿主平台为Linux,目标为宿主和交叉构建的Android NDK。
我只使用 Boost 头文件,我刚刚下载/提取了 boost 文件夹(我没有/usr/include/boost目录)。
在我的CMakeLists.txt文件中,我像这样声明了对 Boost 的依赖:
find_package(Boost 1.57 REQUIRED)
Run Code Online (Sandbox Code Playgroud)
我像这样配置我的构建:
BOOST_ROOT=/path/to/boost cmake ../src
Run Code Online (Sandbox Code Playgroud)
这实际上工程预期为我的本地版本。
当我现在以完全相同的方式配置构建时(仅指定更多环境变量和 CMAKE_TOOLCHAIN_FILE)CMake 给了我:
BOOST_ROOT=/path/to/boost JAVA_HOME=/bla/bla/bla \
ANDROID_NDK=/bla/bla/bla \
ANDROID_SDK=/bla/bla/bla \
ANT=/usr/bin/ant \
cmake ../src -DCMAKE_TOOLCHAIN_FILE=/bla/bla/android.toolchain.cmake
CMake Error at /usr/share/cmake/Modules/FindBoost.cmake:1247 (message):
Unable to find the requested Boost libraries.
Unable to find the Boost header files. Please set BOOST_ROOT to the root
directory containing Boost or …Run Code Online (Sandbox Code Playgroud) 为了避免可变容器/状态,我当前想知道const从某些输入构造STL容器最接近的是什么,例如
const vector<int> input = {2, 13, 7, 1};
Run Code Online (Sandbox Code Playgroud)
我想做的是这样的事情:
const auto transformed = generate_from<vector<string>>(
input.begin(), input.end(), to_string);
do_something(transformed);
Run Code Online (Sandbox Code Playgroud)
虽然你发现最多的方法会创建一个可变对象并修改它(我想避免的):
vector<string> bad_mutable_container;
for (const auto & elem : input) {
bad_mutable_container.push_back(to_string(input[elem]));
};
do_something(bad_mutable_container);
Run Code Online (Sandbox Code Playgroud)
C++ 11和更新提供std::generate和std::generate_n,但他们一个可变对象进行操作,所以他们不解决我的问题:
vector<string> bad_mutable_container(input.size());
generate_n(bad_mutable_container.begin(), input.size(), [&input, n=0] () mutable {
return to_string(input[n++]);
});
Run Code Online (Sandbox Code Playgroud)
您现在可以做的是将该代码封装在函数/ lambda中,它为您提供了const-ness但也提供了嘈杂的样板代码:
const auto transformed = [&input] {
vector<string> bad_mutable_container;
for (const auto & elem : input) {
bad_mutable_container.push_back(to_string(elem));
};
return bad_mutable_container;
} ();
do_something(transformed);
Run Code Online (Sandbox Code Playgroud)
我期望找到至少一些构造函数,例如std::vector …
我想做这样的事情
execute_process(
COMMAND bash -c "git --git-dir ${CMAKE_SOURCE_DIR}/.git ls-files"
OUTPUT_VARIABLE TRACKED_FILES)
add_custom_target(all_file_project SOURCES ${TRACKED_FILES})
Run Code Online (Sandbox Code Playgroud)
命令本身似乎按预期工作,但生成的变量“TRACKED_FILES”仅包含一个逻辑条目(一个多行字符串)而不是文件列表。
我可以以某种方式将包含由换行符(“\n”)分隔的多行的字符串转换为 CMake 中的列表吗?
c++ ×3
cmake ×3
linux ×2
python ×2
arm ×1
autocomplete ×1
bash ×1
boost ×1
boost-python ×1
c++17 ×1
command-line ×1
const ×1
constructor ×1
cpu ×1
dictionary ×1
frequency ×1
generator ×1
list ×1
python-3.5 ×1
python-3.x ×1
set ×1
string ×1
zeromq ×1
zsh ×1