小编Joe*_*Joe的帖子

在控制共享库的导出符号时,CMake等效于"gcc -fvisibility = hidden"是什么?

我用c ++开发了跨平台软件.据我所知,Linux .so默认导出所有符号,"gcc -fvisibility=hidden"我可以将所有导出的符号设置__attribute__(visibility("default"))为隐藏,然后设置我要导出的类和函数,这样我就可以控制我想要导出的内容.

我的问题是,使用CMake,我怎样才能将这项工作作为"gcc -fvisibility = hidden"控制?

gcc visibility cmake

36
推荐指数
2
解决办法
1万
查看次数

用于C或C++的GLL分析器组合器或生成器

是否有任何现有的GLL算法实现,无论是以解析器组合器(首选)的形式,还是作为C或C++的解析器生成器?

我的要求是输出是一个共享打包解析林(SPPF),我以后可以使用语义和/或上下文规则消除歧义.还有其他解析算法,如GLR,它们能够处理一般的无上下文语法,但是,我可以找到的所有GLR解析器生成器要么返回第一个成功的解析树,要么在最后仍有任何歧义时失败.

c c++ parsing parser-combinators parse-forest

16
推荐指数
1
解决办法
1552
查看次数

CMake中LINK_LIBRARIES的递归列表

我试图获取链接到CMake中特定目标的所有库的绝对路径列表,以便在调用时使用add_custom_command.但是,get_target_property(_LINK_LIBRARIES ${TARGET} LINK_LIBRARIES仅包括直接依赖项(即target_link_libraries(${TARGET} ...)调用中使用的任何内容).

因此,如果我链接另一个CMake目标,例如mylibrary,列表将包括mylibrary,但仅作为名称并且没有可传递链接的库.由于此列表还可以包含任意复杂的生成器表达式,因此检查每个项目是否为目标并LINK_LIBRARIES递归检索它是不可行的.此外,目标可以在稍后的时间点指定,CMakeLists.txt并且if(TARGET mylibrary)将被跳过.

对于INCLUDE_DIRECTORIESCOMPILE_DEFINITIONS这是很容易解决的,因为虽然两者的行为类似时get_target_property被使用(不同之处在于所链接的目标显然不能在列表中),则形式的发电机表达$<TARGET_PROPERTY:${TARGET},INCLUDE_DIRECTORIES>产生的递归需要包括和定义所需的列表.但是,$<TARGET_PROPERTY:${TARGET},LINK_LIBRARIES>生成与get_target_property变体相同的列表.

如何检索所需的绝对路径列表?

示范:

cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)

file(WRITE a.cpp "void foo() {};\n")
file(WRITE b.cpp "int main(int, char**) { return 0; }\n")

find_package(Boost REQUIRED COMPONENTS filesystem system)

add_library(A STATIC a.cpp)
target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
target_link_libraries(A PUBLIC ${Boost_LIBRARIES})

# demonstrates (at configure time) that the LINK_LIBRARIES property can contain
# …
Run Code Online (Sandbox Code Playgroud)

cmake

12
推荐指数
2
解决办法
5324
查看次数

从闭包中填充集合时,键入不匹配的"绑定生命周期参数"与"具体生命周期"

我试图在可迭代序列中找到重复.此外,我想知道在那个序列中发生的元素.

我创建了一个,HashMap并试图insert从使用的闭包中调用它take_while.但是,由于与具体/绑定生命周期相关的类型不匹配,到目前为止我还没有设法编译它.

这是我的代码的简化版本,它表现出同样的错误:

use std::collections::HashSet;

fn main() {
    let mut seq = HashSet::new();
    let mut insert = |k| seq.insert(k);
    (1..10).cycle().take_while(insert);
}
Run Code Online (Sandbox Code Playgroud)

以下是我得到的错误:

error[E0631]: type mismatch in closure arguments
 --> src/main.rs:6:21
  |
5 |     let mut insert = |k| seq.insert(k);
  |                      ----------------- found signature of `fn(_) -> _`
6 |     (1..10).cycle().take_while(insert);
  |                     ^^^^^^^^^^ expected signature of `for<'r> fn(&'r {integer}) -> _`

error[E0271]: type mismatch resolving `for<'r> <[closure@src/main.rs:5:22: 5:39 seq:_] as std::ops::FnOnce<(&'r {integer},)>>::Output == bool`
 --> …
Run Code Online (Sandbox Code Playgroud)

closures lifetime rust

9
推荐指数
1
解决办法
256
查看次数

Windows 上的 Qt::AA_SynthesizeMouseForUnhandledTouchEvents

我创建了一个简单的小部件,它将它接收到的鼠标和触摸事件输出到qDebug()(摘录):

// ...

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent), acceptEvents(false)
{
    this->setAttribute(Qt::WA_AcceptTouchEvents);
}

static QEvent::Type const mouseEventTypes[] = {
    QEvent::MouseButtonDblClick,
    QEvent::MouseButtonRelease,
    QEvent::MouseButtonPress,
    QEvent::MouseMove
};

static QEvent::Type const touchEventTypes[] = {
    QEvent::TouchBegin,
    QEvent::TouchUpdate,
    QEvent::TouchEnd
};

template<typename Container, typename Value>
bool contains(Container const & c, Value const & v)
{
    return std::find(std::begin(c), std::end(c), v) != std::end(c);
}

bool MyWidget::event(QEvent * e)
{
    auto type = e->type();
    if(contains(mouseEventTypes, type))
        qDebug() << "MouseEvent";
    else if(contains(touchEventTypes, type))
        qDebug() << "TouchEvent";
    else
        return QWidget::event(e);

    e->setAccepted(this->acceptEvents);
    return …
Run Code Online (Sandbox Code Playgroud)

c++ windows qt windows-7 qt5

5
推荐指数
1
解决办法
1621
查看次数

如何在MinGW(-w64)中捕获延迟导入dll错误(缺少dll或符号)?

使用dlltool -y它可以为现有的.dll或.def文件创建延迟导入库。这似乎可以正常工作,直到没有相应dll的系统上需要dll为止(这对于延迟导入/加载的dll来说是预期的)。但是,我找不到有关如何捕获延迟加载期间生成的错误(缺少模块或缺少功能)的任何信息。

在MSVC上,您将使用__try {} __except (...) {}SEH异常处理,但是,这在MinGW上不可用(我也不知道dlltool使用哪种异常机制)。

常规try {} catch(...) {}也不起作用(应用程序崩溃与没有任何异常处理的方式相同)。

GDB输出也不是特别有用:

gdb: unknown target exception 0xc06d007e at 0x7fefccfaaad

Program received signal ?, Unknown signal.
0x000007fefccfaaad in RaiseException ()
   from C:\Windows\system32\KernelBase.dll
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,在RaiseException中发生未知异常似乎表明是SEH异常。

因此,问题是,有人能成功处理MinGW-w64中的延迟加载吗?

编辑:经过一些实验,我想出了以下解决方案:

extern "C" __declspec(dllexport) void foo(int);

#include <windows.h>
#include <csetjmp>
#include <stdexcept>
#include <memory>
#include <cstdio>

thread_local auto do_handler = true;
thread_local jmp_buf env;
LONG CALLBACK handler(PEXCEPTION_POINTERS e)
{
    if(do_handler)
    {
        // this flag is necessary to prevent a recursive …
Run Code Online (Sandbox Code Playgroud)

c c++ mingw mingw-w64 dlltool

5
推荐指数
0
解决办法
774
查看次数

将antlr4与LLVM集成

我正在使用ANTLR和LLVM开发编译器。我已经使用ANTLR 4的Eclipse IDE实现了词法分析器和解析器。我想使用LLVM实现语义分析器和代码生成器。为此,我想知道如何整合两者。我在网上看到的大多数项目都使用ANTLR进行语义分析(带有访问者和沃克功能),并使用LLVM仅用于代码生成。我想知道如何将ANTLR解析器的输出作为输入传递给LLVM语义分析器。链接到在线示例来说明这一点将非常有用。

compiler-construction integration llvm antlr4

5
推荐指数
1
解决办法
1609
查看次数

检测 WM_MOUSEMOVE 是否由触摸/笔引起

我正在试验 WM_TOUCH 并想检测鼠标事件是从触摸/笔事件合成还是由于实际鼠标事件。

根据MSDN的官方解决方案是检查结果GetMessageExtraInfo()的高 24 位是否设置为0xFF515700.

这有效。大多数时候。如果我用一根手指,一切都很好,但如果我用多根手指,松开最后一根手指会导致鼠标移动GetMessageExtraInfo() == 0。此外,当窗口通过触摸失去焦点时,最多GetMessageExtraInfo() == 0会生成3 条鼠标移动消息。

是否有一种可靠的方法来消除鼠标、触摸和笔输入之间的歧义?

c c++ winapi touch

3
推荐指数
1
解决办法
3134
查看次数