我一直在寻找Autotools和CMake的优点和缺点.但我想知道那些使用这些工具中的一个(或两个)的人的意见.
我基本上在一年前使用过Autotools,我知道其中一个优点是它依赖于shell脚本,因此不需要安装它来运行并使用可移植的shell脚本.但它看起来过于面向unix,并且无法在Windows上运行配置文件.
我现在要为开源项目选择一个构建系统工具,必须至少为Linux和Windows编译.它是用C++编写的,并使用Qt GUI前端,其余部分是"通用的".
谢谢你的帮助.
这是我对cmake的第一次尝试,如果可能的话,我希望有一些关于我做了什么的反馈,因为一些问题仍然存在.
在库文件夹的CMakeLists.txt中,我创建了两个makefile目标:configure-antlr3c和antlr3c.第一个目标运行autotools配置shell脚本,第二个目标运行make可执行文件来构建库:
# CMakeLists.txt in libantlr3c-3.1.3
add_custom_target(
configure-antlr3c
${SHELL_EXECUTABLE} configure
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
add_custom_target(
antlr3c
${MAKE}
DEPENDS configure-antlr3c
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
Run Code Online (Sandbox Code Playgroud)
主要问题是configure-antlr3c目标总是"过时",因此即使没有发生任何变化也会始终执行.此外,我一定需要在一个单独的目录中生成我的cmake makefile(不在我的项目的根目录中),以避免覆盖库的autotools Makefile ...
有谁有这个问题(用cmake构建autotools项目)?如果是这样,你的解决方案是什么?
谢谢.
编辑:解决方案 在根CMakeLists.txt中:
include(ExternalProject)
ExternalProject_Add(
libantlr3c
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3
CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3/configure --prefix=${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3
PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3
BUILD_COMMAND make
BUILD_IN_SOURCE 1
)
Run Code Online (Sandbox Code Playgroud) 我集成了新的隐藏reCAPTCHA(v2)框架,该框架默认使用click提交按钮的事件验证用户.但是在内置HTML5表单验证之前触发此事件.我正在寻找一种方法,使其按预期的顺序进行:首先是表单验证,然后是reCAPTCHA.
基本上,我想有以下语义:
#include <functional>
#include <iostream>
class test
{
public:
void add(std::function<void()> f)
{
f();
}
void operator()()
{
++x;
}
int x = 33;
};
int main()
{
test t;
t.add(t);
// wanted: x == 34 instead: x == 33 since add(t) copies it
}
Run Code Online (Sandbox Code Playgroud)
我理解std :: function包装了一个可调用对象的副本,但有没有办法使用std :: function获取对可调用对象的引用?
有没有办法在私有注册表中提取图像docker build而不是docker hub?
我部署了一个私有注册表,我希望能够避免ip:port在Dockerfile的FROM指令中命名其特定的.我期待一个docker build选项或docker环境变量来更改默认注册表.
我对一年前推出的android dalvik平台上的这个提交非常疑问和困惑.
文件扩展名已更改为C++扩展,以便"将解释器移动到C++中" - 使用编译器的C++前端.
这种变化可能带来什么好处?Dalvik Platform是一个100%的C&asm项目,并没有使用任何C++功能.
我试图了解如何在Windows XP上启动多个进程侦听相同的TCP {IP,Port}对.
例如,我可以启动两个ncat.exe程序监听端口371.第二个程序启动没有任何问题,并接收传入连接,而第一个没有.一旦最后开始的过程终止,第一个接收它们.
netstat -a -n | find "LISTENING"
TCP 0.0.0.0:371 0.0.0.0:0 LISTENING
TCP 0.0.0.0:371 0.0.0.0:0 LISTENING
Run Code Online (Sandbox Code Playgroud)
假设这是一种Windows(XP)行为,它如何成为一种安全可靠的行为?这意味着可以"重载"任何已经侦听的端口,而不是获取通常的"已使用的地址"错误消息,并简单地绕过防火墙,规则只是说"允许端口371上的任何传入TCP连接".
我正在使用一个非常简单的sed脚本删除注释: sed -e 's/--.*$//'
它非常有用,直到评论中出现非ascii字符,例如:-- °.此行与正则表达式不匹配,未替换.
知道如何.真正匹配任何角色吗?
方案:
由于file它是iso8859文本,LANG因此在调用之前必须更改变量环境sed:
LANG=iso8859 sed -e 's/--.*//' -
GitHub解释说,您可以分叉,修改,提交,推送和触发拉取请求.他们还解释说,您仍然可以修改,提交,推送,并在网站上更新请求.
我想知道是否可以做同样的事情但不是叉子的作者?我是一个回购请求的拥有者,我想要纠正自己,但后来仍然在讨论......我试图将我的更改推送到作者的回购(想一些正确的访问将被计算)但访问被拒绝.
我对改变有着奇怪的副作用LD_LIBRARY_PATH.
当我追加包含库的路径时,例如:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib
Run Code Online (Sandbox Code Playgroud)
然后,一切都变得令人难以置信地缓慢.例如,一个简单的ls可以是10秒长.
ldd输出是完全一样的前和后LD_LIBRARY_PATH的变化,我试图调试缓慢的执行ls具有strace:我得到了这两种情况下完全相同的执行.在执行过程中执行甚至不会卡住ls(因为strace在10秒滞后期间不输出任何内容然后突然完美执行ls).所以我认为它可能来自我的shell,但是这是相同的,strace在我的bash上运行并且ls在两种情况下执行都给出了相同的strace输出:shell执行ls并等待其执行结束(strace滞后之前的最后一个输出strace)waitpid(...)).所以我想在启动ls和执行之间发生了一些错误,就好像它是一个内核级别的问题.这真的就像如果sleep是上进行ls(0 CPU使用率).
在延迟期间,我的CPU和网络活动完全正常......
请注意,新LD路径中的库不会与任何"标准库"冲突,因此ls在我的示例中它不会打扰.
因此,我对有关LD_LIBRARY_PATH副作用或如何深入调试我的示例的更深入解释感兴趣.