小编jpo*_*o38的帖子

Visual Studio 2015项目构建失败但没有错误

我的项目构建都失败了,但我没有显示任何错误.我试过清洁和重建,但没有用.

我将MSBuild输出详细程度改为'Diagnostic',希望它能帮我识别问题,现在我卡住了.这是输出的样子:

1>Project 'ProjectMM.Data.Models' is not up to date. Input file 'C:\Projects\ProjectMM\ProjectMM.Data.Models\ProjectMM.Data.Models.csproj' is modified after output file 'C:\Projects\ProjectMM\ProjectMM.Data.Models\bin\Debug\ProjectMM.Data.Models.pdb'.
All packages are already installed and there is nothing to restore.
1>------ Build started: Project: ProjectMM.Data.Models, Configuration: Debug Any CPU ------
2>Project 'ProjectMM.Data' is not up to date. Input file 'C:\Projects\ProjectMM\ProjectMM.Data\ProjectMM.Data.csproj' is modified after output file 'C:\Projects\ProjectMM\ProjectMM.Data\bin\Debug\ProjectMM.Data.pdb'.
2>------ Build started: Project: ProjectMM.Data, Configuration: Debug Any CPU ------
3>Project 'ProjectMM' is not up to date. Input file 'c:\projects\projectmm\projectmm\app_start\bundleconfig.cs' is modified after output file …
Run Code Online (Sandbox Code Playgroud)

msbuild build visual-studio visual-studio-2015

104
推荐指数
9
解决办法
6万
查看次数

为什么Release/Debug对std :: min有不同的结果?

这是测试程序:

void testFunc()
{
    double maxValue = DBL_MAX;
    double slope = std::numeric_limits<double>::quiet_NaN();

    std::cout << "slope is " << slope << std::endl;
    std::cout << "maxThreshold is " << maxValue << std::endl;
    std::cout << "the_min is " << std::min( slope, maxValue) << std::endl;
    std::cout << "the_min is " << std::min( DBL_MAX, std::numeric_limits<double>::quiet_NaN()) << std::endl;
}

int main( int argc, char* argv[] )
{
    testFunc();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Debug中,我得到:

slope is nan
maxThreshold is 1.79769e+308
the_min is nan
the_min is 1.79769e+308
Run Code Online (Sandbox Code Playgroud)

在发布中,我得到:

slope …
Run Code Online (Sandbox Code Playgroud)

c++ nan min floating-point-comparison

41
推荐指数
3
解决办法
3263
查看次数

CMake和qmake之间有什么区别和相似之处?

我想知道 在qmake上使用CMake特定项目的原因,反之亦然.

两个构建系统的优点和缺点是什么?我搜索并找到了一些文件,但感觉很难理解.

c++ qt qmake cmake

32
推荐指数
5
解决办法
3万
查看次数

可以使用基于范围的C++ 11来执行/检查额外的操作/条件吗?

我正在发现基于C++ 11范围的循环并且已经喜欢它了.它可以让您在编码时节省大量时间.

但是,我习惯于编写一些带有额外语句/条件的循环,并且我想知道这可以在使用C++ 11基于范围的循环时实现:

1.额外增量

std::vector<int> v = { 1, 2, 3, 4, 5 };
size_t index = 0;
for ( std::vector<int>::const_iterator iter = v.begin(); iter != v.end(); ++iter, ++index )
{
    std::cout << "v at index " << index << " is " << *iter;
}
Run Code Online (Sandbox Code Playgroud)

可能成为:

size_t index = 0;
for ( int val : v )
{
    std::cout << "v at index " << index << " is " << *iter;
    ++index;
}
Run Code Online (Sandbox Code Playgroud)

然而,增加indexfor …

c++ for-loop c++11

32
推荐指数
3
解决办法
4652
查看次数

if-else语句中的"等于"与"不等于"运算符

当在C中编写if-else语句时,是否有人会优先使用"等于"运算符而不是"不等于",而两者都可以产生相同的结果?

下面的代码提供了上下文.因此,如果参数计数等于2,则将从用户检索字符串.但是,如果获得任何其他参数值,则会显示错误消息.

int main(int argc, string argv[])
{
    string msg;

    if (argc == 2) 
    {
        msg = GetString();
    }
    else
    {
        printf("ERROR: Please only enter a single key! \n");
        return 1;
    }
Run Code Online (Sandbox Code Playgroud)

但是,通过将if-else循环的条件更改为"not equals to",并翻转相关的操作,我可以实现与上述完全相同的结果.见下文:

int main(int argc, string argv[])
{
    string msg;

    if (argc != 2) 
    {
        printf("ERROR: Please only enter a single key! \n");
        return 1;
    }
    else
    {
        msg = GetString();
    }
Run Code Online (Sandbox Code Playgroud)

无论如何,因为两者产生相同的结果,是否应该优先使用另一个?

c c++

18
推荐指数
3
解决办法
2万
查看次数

编译后更改Linux共享库(.so文件)版本

我正在编译Linux库(对于Android,使用NDK的g ++,但我敢打赌我的问题对任何Linux系统都有意义).在将这些库提供给合作伙伴时,我需要使用版本号标记它们.我还必须能够以编程方式访问版本号(例如,在"关于"对话框或GetVersion函数中显示它).

我首先使用unversioned标志(版本0.0)编译库,并且在我将测试发送给合作伙伴之前完成测试时需要将此版本更改为真实版本.我知道修改源代码并重新编译会更容易,但我们不想这样做(因为如果我们重新编译代码,我们应该再次测试所有内容,我们觉得它不会出错,请看这个注释post和最后因为我们的开发环境以这种方式工作:我们为Windows二进制文件执行此过程:我们设置0.0资源版本字符串(.rc),然后我们使用verpatch更改它...我们想要使用相同的类型运送Linux二进制文件时的进程).

这里最好的策略是什么?总而言之,要求是:

  1. 用"未设置"版本(0.0或其他任何东西)编译二进制文件
  2. 能够将此"未设置"版本修改为特定版本而无需重新编译二进制文件(理想情况下,运行第三方工具命令,就像在Windows下使用verpatch一样)
  3. 能够让库代码在运行时检索它的版本信息

如果您的答案是"重命名.so",那么请提供3的解决方案:如何在运行时检索版本名称(即:文件名).

我在考虑一些解决方案,但不知道它们是否可以工作以及如何实现它们.

  • 在代码中有一个版本变量(一个string或三个int),并有办法在以后的二进制文件中更改它?使用二进制sed ......?
  • 在资源中有一个版本变量,并有办法在以后的二进制文件中更改它?(正如我们为win32/win64所做的那样)
  • 使用专用于此的.so(如SONAME)字段,并有一个允许更改它的工具......并使其可以从C++代码访问.
  • 重命名lib +更改SONAME(没有找到如何实现)...并找到一种从C++代码中检索它的方法.
  • ...

请注意,我们使用QtCreator来编译Android .so文件,但它们可能不依赖于Qt.因此使用Qt资源并不是一个理想的解决方案.

c++ linux versioning g++ shared-libraries

17
推荐指数
1
解决办法
2417
查看次数

为什么STL需要一个临时迭代器变量来编译它?

这是一段非常简单的代码:

#include <vector>

int main() {

    std::vector<int> myVec(5);
    std::vector<int>::const_iterator first = myVec.begin();
    std::vector<int>::const_iterator last = myVec.begin() + 3;
    std::vector<int> newVec1(first, last);
    std::vector<int> newVec2(myVec.begin(), last);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

行声明newVec1编译.

行声明newVec2失败,出现以下错误:

prog.cpp: In function 'int main()':
prog.cpp:11:49: error: no matching function for call to 'std::vector<int>::vector(std::vector<int>::iterator, std::vector<int>::const_iterator&)'
     std::vector<int> newVec2(myVec.begin(), last);
                                                 ^
prog.cpp:11:49: note: candidates are:
In file included from /usr/include/c++/4.9/vector:64:0,
                 from prog.cpp:3:
/usr/include/c++/4.9/bits/stl_vector.h:401:9: note: template<class _InputIterator, class> std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const allocator_type&)
         vector(_InputIterator __first, _InputIterator __last,
         ^
/usr/include/c++/4.9/bits/stl_vector.h:401:9: note: …
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl

14
推荐指数
1
解决办法
3754
查看次数

附加到CMAKE_C_FLAGS

我正在使用CMake进行两个版本的项目,其中一个需要-lglapi而另一个则不需要.

到目前为止,我们使用的线条看起来像这样:

SET(CMAKE_C_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
SET(CMAKE_CXX_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
Run Code Online (Sandbox Code Playgroud)

我在我的CMakeList.txt中添加了一个if语句,紧跟在这些行之后:

if(SINGLE_MODE)
    SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " -lglapi")
    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -lglapi")
endif(SINGLE_MODE)
Run Code Online (Sandbox Code Playgroud)

SINGLE_MODE变量定义了一点点.当我使用message命令显示标志变量的内容时,它看起来没问题:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm -lglapi
Run Code Online (Sandbox Code Playgroud)

但是当我开始编译时,我遇到了编译错误.使用详细模式我意识到在编译器调用中看起来像:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm; -lglapi
Run Code Online (Sandbox Code Playgroud)

也就是说,在将-lglapi添加到列表之前添加了分号.

这里有没有人遇到类似的问题,并知道解决这个问题的方法?我用谷歌搜索了很长一段时间并研究了CMake手册,但看不出我在这里做错了什么.

谢谢,托比亚斯

c c++ cmake compiler-flags linker-flags

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

有没有办法阻止开发人员使用std :: min,std :: max?

我们有一个算法库对可能是NaN的数字进行大量std::min/ std::max操作.考虑这篇文章:为什么Release/Debug对std :: min有不同的结果?,我们意识到它显然是不安全的.

有没有办法阻止开发人员使用std::min/ std::max

我们的代码使用VS2015和g ++编译.我们的所有源文件都包含一个公共头文件(通过/FIVS2015和-includeg ++的选项).是否有任何代码/编译指示可以放在这里使任何cpp文件使用std::minstd::max无法编译?

顺便说一下,使用此功能的遗留代码(如STL标头)不应受到影响.只有我们编写的代码才会受到影响.

c++

12
推荐指数
3
解决办法
4003
查看次数

使用std :: ios_base :: binary有什么意义?

我在Window下读取Linux文件时出现问题.这是问题讨论:在Windows下使用fstream :: seekg在Unix下创建的文件.

通过打开指定的文本文件来解决该问题std::ios_base::binary.

但这种模式的实际意义是什么?如果指定,您仍然可以将文件用作文本文件(使用mystream << "Hello World" << std::endl和阅读std::getline).

在Windows下,唯一的区别,我注意到的是mystream << "Hello World" << std::endl使用:

  • 0x0D 0x0A如果std::ios_base::binary未指定行分隔符(EOL和回车)
  • 0x0A作为行分隔符if if std::ios_base::binary指定(仅限EOL)

打开生成的文件时,记事本不能巧妙地显示行std::ios_base::binary.像vi或Wordpad这样的优秀编辑确实展示了它们.

这是否真的是有和没有生成的文件之间的唯一区别std::ios_base::binary?文档说Consider stream as binary rather than text.,这到底是什么意思?

std::ios_base::binary如果我不关心在记事本中打开文件并且想要fstream::seekg一直工作,总是设置是否安全?

c++ iostream stl eol

10
推荐指数
1
解决办法
4804
查看次数