小编fra*_*ans的帖子

CMake生成器表达式未被评估

由于以下警告:

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所以我做错了什么?

cmake

7
推荐指数
2
解决办法
6969
查看次数

zsh:如何使标签完成不需要光标后的下一个单词的空格?

zshbash标签完成之间存在令人讨厌的区别:

想象一下,你写了一些命令,并希望在行的开头添加一些东西:

$ 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光标左侧的短语完整,无论它是否以空格终止?

bash zsh autocomplete tab-completion

7
推荐指数
1
解决办法
753
查看次数

如何“深度合并”字典?

想象一下以下命令:

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)

额外好的解决方案是返回深层副本ab我可以在不更改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)

python dictionary python-3.5

7
推荐指数
1
解决办法
1414
查看次数

是否存在独立于编程语言的任意集合的通用查询语言?

我正在寻找一种独立于编程语言或集合类型来定义集合查询的方法。

详细来说,这将是 Java、C++、Python 等常见语言的语言定义和实现。

正如所评论的,我不是在寻找数据库或集合表示的任何实现,而只是寻找一种定义元素查询的方法,例如Pythonstd::set/vectorset()任何可以视为集合的线性结构。

一个类似的例子是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 是解决不同问题的一个很好的例子:清晰的语言定义和适用于任何平台或编程语言的解析器/工具。

cross-platform cross-language set

6
推荐指数
1
解决办法
1283
查看次数

从另一个线程中止zeromq recv()或poll() - 立即无需等待超时

我在许多配置中使用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)

c++ python zeromq

6
推荐指数
1
解决办法
1172
查看次数

Python中的错误?threading.Thread.start() 并不总是返回

我有一个很小的 ​​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函数之前调用)?

multithreading boost-python python-3.x

6
推荐指数
1
解决办法
2157
查看次数

如何在 ARM/Linux 机器上获取 CPU 时钟频率

我猜答案似乎很明显,但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。我没有在这台机器上调用hwinfodmidecode或任何可执行文件cpu*:)

您知道如何以编程方式检索或“测量”CPU 的实际频率吗?

linux cpu arm frequency

6
推荐指数
1
解决办法
6520
查看次数

在某些情况下,CMake 找不到 Boost 的可能原因?

我使用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)

c++ linux boost cross-platform cmake

6
推荐指数
1
解决办法
816
查看次数

如何在现代C++中使用生成器初始化const容器?

为了避免可变容器/状态,我当前想知道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::generatestd::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 …

c++ constructor const generator c++17

6
推荐指数
1
解决办法
369
查看次数

在 CMake 中如何将命令的多行输出转换为列表?

我想做这样的事情

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 中的列表吗?

string command-line list cmake

6
推荐指数
1
解决办法
1488
查看次数