我正在尝试/std:c++17使用CMake 将编译器标志添加到VS2017.到目前为止,我正在使用"现代"的跨平台方式:
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) # -std=c++11 instead of -std=gnu++11
set(MY_CXX_COMPILE_FEATURES cxx_generic_lambdas cxx_range_for cxx_strong_enums)
add_library(mylib INTERFACE)
target_compile_features(mylib INTERFACE ${MY_CXX_COMPILE_FEATURES})
Run Code Online (Sandbox Code Playgroud)
这增加/std:c++14了VS2017(无论如何可能是默认值?).但是我无法将其切换到C++ 17(即添加它/std:c++17).如果我只是手动添加它,我会收到不太好的警告,因为两个标志都存在:
1>cl : Command line warning D9025: overriding '/std:c++14' with '/std:c++17'
我已经尝试set(CMAKE_CXX_STANDARD 17)但它没有效果,事实上CMake文档提到CMAKE_CXX_STANDARD对VS无影响.
至于添加C++ 17功能target_compile_features,它似乎还没有(甚至在CMake-3.9.0-rc5中),即使有,我特别只使用std::optionalC++ 17 ,并没有target_compile_features像图书馆功能的标志std::optional.
所以我的问题是,使用CMake做到这一点的最好(或最不丑陋)的方法是什么?在某种程度上它也适用于gcc和clang?我很高兴使用最近的CMake版本(3.8或3.9).我更喜欢它是"好"而不是手动循环通过CXX_COMPILE_FLAGS并删除字符串"/ std:c ++ 14"或类似的一些黑客.
(编辑:它也可以是VS /std:c++latest开关 - 以可能的为准.两者都可以用于此目的.)
是boost::lexical_cast现在的冗余度,C++ 11引入stoi,stof和家人,或者是没有任何理由仍然使用它?(除了没有C++ 11编译器)它们是否提供完全相同的功能?
我有以下项目结构:
主要的CMakeLists.txt看起来像:
PROJECT( ${PROJECT_NAME} )
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(app)
Run Code Online (Sandbox Code Playgroud)
lib1/CMakeLists.txt看起来像(剥离):
SET(SOURCE
file.cpp
)
SET(HEADERS
some_lib_header.h
)
add_library( lib1 ${SOURCE} ${HEADERS} )
Run Code Online (Sandbox Code Playgroud)
除了ADD_EXECUTABLE之外,app的应用程序看起来相同:
SET(SOURCE
main.cpp
)
SET(HEADERS
some_header.h
)
add_library( lib1 ${SOURCE} ${HEADERS} )
ADD_EXECUTABLE( app ${SOURCE} ${HEADERS} )
Run Code Online (Sandbox Code Playgroud)
我发现这个设置运行良好,因为我可以生成一个包含所有这三个项目的Visual Studio解决方案文件.但我的问题是我的应用程序包含lib1的头文件(以及lib2的头文件,它依赖于lib1).当我做
$mkdir build
$cd build
$cmake -C ..\myproject
Run Code Online (Sandbox Code Playgroud)
它会根据我的需要生成源外VS.sln文件,但是应用程序无法编译,因为它无法找到lib1的头文件(显然).
现在我阅读并尝试了很多东西,比如TARGET_LINK_LIBRARIES( app lib1 )(它让应用程序与lib1链接,但没有解决头部包含问题),以及add_subdirectory( ../lib1 )各种变体,如应用程序的CMakeLists.txt(这些都抛出了我无法解决的错误)不修复,还有find_package(我猜这是错误的方法).
那么如何解决这个问题(我想简单......)问题呢?
从源代码编译OpenCV时,有一个CMake选项WITH_EIGEN,它表示"包括Eigen3支持".但是,在文档中没有任何地方(或谷歌,就此而言)我可以找出它究竟是做什么以及如何使用它.我可以想象一些选择:
我可以继续使用cv :: Mat,而某些函数(哪些?)如cv :: Mat :: inv()将开始使用Eigen的算法?
或者WITH_EIGEN标志基本上什么也不做,我需要将cv :: Mat转换为Eigen(或使用Eigen :: Map),然后手动使用Eigen的算法?
我有一个Visual Studio 2010解决方案,其中包含5个项目,两个库和三个应用程序(取决于库).我现在想将构建系统迁移到CMake(也可以在Linux下编译).
我已经找到了如何为一个项目编写CMakeLists.txt并创建一个在VS中编译的.sln文件.但是,我找不到一个解决方案来在CMake文件中指定每个单独的项目,然后自动让CMake创建一个包含这5个项目的VS .sln.
我如何构建我的项目和CMakelists来实现这一目标?
在应用程序中编译需要哪些软件Qt/QML才能调试/配置QML?
我当前的应用程序是使用cmake构建并在嵌入式设备上运行.此外,我开始使用Qt 4.8.3(直到现在4.7.0).
我想使用这些奇特/酷的功能(对于嵌入式开发人员):
http://doc.qt.digia.com/qtcreator/creator-qml-performance-monitor.html
我已经通过qt-project寻找帮助,但是我还不清楚当你想要使用自定义构建环境调试/配置远程应用程序时需要什么步骤.
所以,我想知道是否需要以下任何步骤,并且在正面情况下,实际上是所需的代码.
欢迎任何帮助,链接等.
我目前正在创建一个包含多个页面的bootstrap的站点.我的方法是创建多个html文件,例如Index.html,Products.html,Contact.html.
现在,我是否必须在每个文件中复制导航栏的代码?这似乎相当麻烦,因为当我想在导航栏中更改某些内容时,我必须在每个文件中更改它.
(当然代码不会完全重复,例如每个html页面上的活动类不同,但99%是常见代码)
我当然知道我可以使用像Joomla这样的CMS来处理这个问题.但如果我不想采取这一步骤,是否可以使用Bootstrap?或者那不是Bootstrap的用途?奇怪的是,我无法通过查询得到任何关于该主题的谷歌搜索.也许我错过了什么.
在下面的代码中,std :: min/max的模板类型推导似乎很奇怪,我想知道为什么以及如何正确修复它.
以下适用于Windows VS2013,并在GCC-4.8上给出了编译错误:(参见下面的错误)
int minX = max(min(floor(v1[0]), min(floor(v2[0]), floor(v3[0]))), 0.0f);
Run Code Online (Sandbox Code Playgroud)
这在GCC-4.8上编译,但在VS2013上给出了编译错误:(见下面的错误)
int minX = max(min(floor(v1[0]), min(floor(v2[0]), floor(v3[0]))), 0.0);
Run Code Online (Sandbox Code Playgroud)
v[1-3] 是一个 cv::Vec3f v1, v2, v3;
从OpenCV开始,cv :: Vec3f是a Vec<float, 3>和Vec's运算符[]
const _Tp& operator [](int i) const;
_Tp& operator[](int i);
Run Code Online (Sandbox Code Playgroud)
min/max/floor/ceil来自std :: namespace(即using std::min代码顶部的等等).
所以当我写作
int minX = max(min(floor(v1[0]), min(floor(v2[0]), floor(v3[0]))), 0.0f);
Run Code Online (Sandbox Code Playgroud)
类型应该是
max(min(float, min(float, float), float);
Run Code Online (Sandbox Code Playgroud)
那么为什么海湾合作委员会会在这里纾困?
VS2013出错:
error C2782: 'const _Ty &std::max(const _Ty &,const _Ty &)' : template parameter '_Ty' is ambiguous
C:\Program …Run Code Online (Sandbox Code Playgroud) 我正在用QtQuick 2(Qt5.2)QML和C++开发游戏.我想要C++中的大部分游戏逻辑(我不想用JS做),而我正在尝试将QStateMachines用于很多逻辑.
现在我的问题是,如何在该场景中实现正确的游戏循环?
例如,游戏具有从屏幕上的某些路点移动的对象,因此我认为我无法完成基于状态/事件的所有事情.在某些时候我需要说"我的物体应该每秒向x方向移动10个像素".因此,例如当我的对象处于其"移动"状态时,它应该每秒移动一定量,然后当然必须检查某些条件是否必须切换状态(例如,"攻击").
现在,Qt-examples和web上的所有演示似乎都是完全基于事件的(例如,四行一样的胜利)或用JavaScript编写.所以我在这里有点迷失.
我能找到的一个想法是用一个例如30ms的定时器创建一个QTimer,并将该QTimer的timeout()信号连接到每个移动对象的advance()槽,并在'return app.exec();'之前启动该定时器.像这样:
QTimer timer;
QObject::connect(&timer, SIGNAL(timeout()), &scene, SLOT(advance()));
timer.start(1000 / 33);
return app.exec();
Run Code Online (Sandbox Code Playgroud)
然后每个对象(例如鼠标)都有一个
void Mouse::advance(int step)
Run Code Online (Sandbox Code Playgroud)
但是,这需要一个QGraphicsScene,我不确定Android/iOS上的QtQuick/QML项目有多好.
这是一个好的解决方案吗?或者我对问题的看法有些错误,我不需要游戏循环来实现我的目标?
解决方案不应该使用Qt中任何仅限桌面的东西,即它应该适用于Android,iOS和桌面.
覆盖优化级别标志( 等以及 MSVC 对应项 )的推荐方法-O2是-O3什么/?
target_compile_options(mytarget PUBLIC "$<$<CONFIG:RELWITHDEBINFO>:/Od>")
这会导致编译器输出:
cl:命令行警告 D9025:用“/Od”覆盖“/O2”
我很高兴使用最新的 CMake 3.13.2。
c++ ×8
cmake ×5
opencv ×2
qt ×2
stl ×2
boost ×1
c++11 ×1
c++17 ×1
dependencies ×1
eigen ×1
embedded ×1
game-engine ×1
gcc ×1
header-files ×1
html ×1
qml ×1
qtquick2 ×1
std ×1
visual-c++ ×1