以下代码段是我使用的记录器的简化版本.它扩展std::ostringstream并可以使用<<-operator 填充.销毁后,所有内容都会写入std::cout.
将(<<)直接写入临时对象,Logger()我希望它能打印输入,但是,它只打印某些东西的地址std::cout.写入临时对象的引用时Logger().stream(),按预期工作.
为什么会这样?
顺便说一句,这种行为只发生在我必须使用的C++ 98-land(ideone)中.使用C++ 11(coliru)和C++ 14(ideone)时,两个调用变量都按预期工作.C++ 11/14有什么不同?
#include <iostream>
#include <sstream>
class Logger : public std::ostringstream
{
public:
~Logger()
{
std::cout << this->str() << std::endl;
}
Logger& stream()
{
return *this;
}
};
int main( int argc, char ** argv )
{
// 1.
// Prints an address, e.g. 0x106e89d5c.
Logger() << "foo";
// 2.
// Works as …Run Code Online (Sandbox Code Playgroud) 请考虑以下最小示例:
.
??? bar
? ??? CMakeLists.txt
??? CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
这里./CMakeLists.txt是
project( foo )
cmake_minimum_required( VERSION 2.8 )
set( FOO "Exists in both, parent AND in child scope." )
add_subdirectory( bar )
message( STATUS "Variable BAR in ./ = ${BAR}" )
message( STATUS "Variable FOO in ./ = ${FOO}" )
Run Code Online (Sandbox Code Playgroud)
并且./bar/CMakeLists.txt是
set( BAR "Exists in parent scope only." PARENT_SCOPE )
message( STATUS "Variable BAR in ./bar/ = ${BAR}" )
Run Code Online (Sandbox Code Playgroud)
输出的相关部分cmake是这样的:
...
-- Variable BAR in …Run Code Online (Sandbox Code Playgroud) 说我有一个可执行文件(在mac,win和linux上运行)
a.out [-a] [-b] [-r -i <file> -o <file> -t <double> -n <int> ]
Run Code Online (Sandbox Code Playgroud)
其中一个参数[ ]意味着它是可选的.但是,如果最后一个参数-r设置,那么-i,-o,-t,和-n必须提供的,太.
有很多优秀的C++ - 用于解析命令行参数的库,例如gflags(http://code.google.com/p/gflags/),tclap(http://tclap.sourceforge.net/), simpleopt(http://code.jellycan.com/simpleopt/),boost.program_options(http://www.boost.org/doc/libs/1_52_0/doc/html/program_options.html)等.但我想知道如果有一个允许我直接编码参数之间的这些条件关系,无需手动编码错误处理
if ( argR.isSet() && ( ! argI.isSet() || ! argO.isSet() || ... ) ) ...
Run Code Online (Sandbox Code Playgroud)
并手动设置--help.
库tclap允许XOR参数,例如,-a或者-b是允许的,但不是两者.所以,在那个术语中,参数的AND会很好.
有没有人知道一个多功能,轻量级,跨平台的库可以做到这一点?
似乎CMake ExternalProject总是假定外部项目的根目录是源目录.但如果不是这样呢?
请考虑以下示例:
外部项目使用此目录布局:
libfoo.git <--- ExternalProject assumes this as source dir.
??? ...
??? libfoo <--- However, the actual source directory is this!
??? CMakeLists.txt
??? ...
Run Code Online (Sandbox Code Playgroud)
在依赖项目libfoo中配置如下:
ExternalProject_Add( libfoo
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/EP_libfoo"
GIT_REPOSITORY "<link to remote which hosts libfoo.git>"
GIT_TAG "<some hash>"
)
Run Code Online (Sandbox Code Playgroud)
然后生成失败,并显示以下错误消息:
$ cmake -H/path/to/source-dir -B/path/to/build-dir
...
$ cmake --build /path/to/build-dir/ --target all
...
CMake Error: The source directory "/path/to/build-dir/EP_libfoo/src/libfoo" does not appear to contain CMakeLists.txt.
...
$
Run Code Online (Sandbox Code Playgroud)
因此,正如上面的目录布局所指出的,CMake认为外部项目的根是
/path/to/build-dir/EP_libfoo/src/libfoo
Run Code Online (Sandbox Code Playgroud)
事实上,它确实如此
/path/to/build-dir/EP_libfoo/src/libfoo/libfoo
Run Code Online (Sandbox Code Playgroud)
我试图解决这个问题:
不幸的是,修改参数 …
我在C++中使用CMake 3.0和我自己的iOS项目,它使用OpenCV作为依赖项.该项目生成一组由应用程序项目加载的库.
在我的CMake中,我尝试寻找OpenCV依赖,它自动在Windows和Linux中,但在Android和iOS中我必须设置正确的包.使用Android,使用以下代码设置$ {OpenCV_dir}/sdk/native/jni works属性:
SET(OpenCV_DIR NOT_FOUND CACHE PATH "Path to use OpenCV")
IF(OpenCV_DIR STREQUAL NOT_FOUND)
FIND_PACKAGE( OpenCV PATHS ${OpenCV_DIR})
MESSAGE(FATAL_ERROR "--***-- Warning: Install and configure path to prebuilt OpenCVConfig.cmake")
ENDIF()
Run Code Online (Sandbox Code Playgroud)
在iOS中,这不起作用.我通常在没有找到OpenCV的情况下创建项目Xcode项目,然后我拖放框架并使用自定义路径配置手动变量框架搜索路径,
/Users/Piperoman/Libraries/opencv2.4.9IOS
Run Code Online (Sandbox Code Playgroud)
但使用CMake代码却找不到它.
定位框架有什么问题?