我用c ++开发了跨平台软件.据我所知,Linux .so默认导出所有符号,"gcc -fvisibility=hidden"我可以将所有导出的符号设置__attribute__(visibility("default"))为隐藏,然后设置我要导出的类和函数,这样我就可以控制我想要导出的内容.
我的问题是,使用CMake,我怎样才能将这项工作作为"gcc -fvisibility = hidden"控制?
是否有任何现有的GLL算法实现,无论是以解析器组合器(首选)的形式,还是作为C或C++的解析器生成器?
我的要求是输出是一个共享打包解析林(SPPF),我以后可以使用语义和/或上下文规则消除歧义.还有其他解析算法,如GLR,它们能够处理一般的无上下文语法,但是,我可以找到的所有GLR解析器生成器要么返回第一个成功的解析树,要么在最后仍有任何歧义时失败.
我试图获取链接到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_DIRECTORIES和COMPILE_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) 我试图在可迭代序列中找到重复.此外,我想知道在那个序列中发生的元素.
我创建了一个,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) 我创建了一个简单的小部件,它将它接收到的鼠标和触摸事件输出到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) 使用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) 我正在使用ANTLR和LLVM开发编译器。我已经使用ANTLR 4的Eclipse IDE实现了词法分析器和解析器。我想使用LLVM实现语义分析器和代码生成器。为此,我想知道如何整合两者。我在网上看到的大多数项目都使用ANTLR进行语义分析(带有访问者和沃克功能),并使用LLVM仅用于代码生成。我想知道如何将ANTLR解析器的输出作为输入传递给LLVM语义分析器。链接到在线示例来说明这一点将非常有用。
我正在试验 WM_TOUCH 并想检测鼠标事件是从触摸/笔事件合成还是由于实际鼠标事件。
根据MSDN的官方解决方案是检查结果GetMessageExtraInfo()的高 24 位是否设置为0xFF515700.
这有效。大多数时候。如果我用一根手指,一切都很好,但如果我用多根手指,松开最后一根手指会导致鼠标移动GetMessageExtraInfo() == 0。此外,当窗口通过触摸失去焦点时,最多GetMessageExtraInfo() == 0会生成3 条鼠标移动消息。
是否有一种可靠的方法来消除鼠标、触摸和笔输入之间的歧义?