小编Mat*_* M.的帖子

如何使用CMake正确添加包含目录

大约一年前,我询问了CMake中的头依赖关系.

我最近意识到问题似乎是CMake认为那些头文件是项目外部的.至少,在生成Code :: Blocks项目时,头文件不会出现在项目中(源文件会出现).因此,在我看来,CMake认为这些标题是项目的外部,并且不会在依赖项中跟踪它们.

在CMake教程中快速搜索只指出include_directories哪个似乎没有我想做的...

向CMake发出信号通知特定目录是否包含要包含的标头的正确方法是什么,并且生成的Makefile应该跟踪这些标头?

c++ ubuntu cmake

208
推荐指数
7
解决办法
35万
查看次数

弃用静态关键字...不再?

在C++中,可以static在翻译单元中使用关键字来影响符号的可见性(变量或函数声明).

在n3092,这被弃用了:

附件D.2 [depr.static]
在命名空间范围内声明对象时,不推荐使用static关键字(见3.3.6).

在n3225中,这已被删除.

我能找到唯一一篇文章有些不正式.

它确实强调,为了与C兼容(以及将C程序编译为C++的能力),弃用令人讨厌.但是,直接将C程序编译为C++本身就是一种令人沮丧的经历,所以我不确定它是否值得考虑.

有谁知道为什么它被改变了?

c++ standards static c++11

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

Visual Studio 2010的奇怪"警告LNK4042"

我刚刚被Visual Studio 2010(C++)发出的一些非平凡的警告殴打(而不是很难).

编译给出了以下输出:

1 Debug\is.obj:警告LNK4042:对象指定多次; 附加项忽略
1 Debug\make.obj:警告LNK4042:对象指定多次; extras忽略
1 Debug\view.obj:警告LNK4042:对象指定多次; extras忽略
1 identity.obj:错误LNK2019:未解析的外部符号void __cdecl test::identity::view(void)(?view @ identity @ test @@ YAXXZ)在函数中引用void __cdecl test::identity::identity(void)(?identity @ 0test @@ YAXXZ)
1 identity.obj:错误LNK2019:未解析的外部符号void __cdecl test::identity::make(void)(?make @ identity @ test @@ YAXXZ)在函数中引用void __cdecl test::identity::identity(void)(?identity @ 0test @@ YAXXZ)
1 range.obj:错误LNK2019:未解析的外部符号void __cdecl test::range::is(void)(?是@ range @ test @@ YAXXZ)在函数中引用void __cdecl test::range::range(void)(?range @ 0test @@ YAXXZ)

链接器错误总是很难调试...但是有未解决的引用,所以我检查了......但是源代码是格式良好的......最后它击中了我:

我的文件夹层次结构如下:

src/
  identity/
    is.cpp
    make.cpp
    view.cpp
  range/ …
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio-2010 visual-studio visual-c++ visual-c++-2010

76
推荐指数
4
解决办法
4万
查看次数

保证执行memcpy(0,0,0)是否安全?

我不太熟悉C标准,所以请耐心等待.

我想知道,按标准保证memcpy(0,0,0)是否安全.

我能找到的唯一限制是,如果内存区域重叠,那么行为是未定义的......

但我们可以认为这里的内存区域重叠吗?

c memcpy null-pointer language-lawyer

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

63
推荐指数
9
解决办法
1万
查看次数

如何让IOStream表现更好?

大多数学习C的C++用户都喜欢使用printf/ scanf系列函数,即使他们使用C++进行编码也是如此.

虽然我承认我发现接口方式更好(特别是类似POSIX的格式和本地化),但似乎压倒性的关注是性能.

看看这个问题:

如何加快逐行读取文件的速度

似乎最好的答案是使用fscanf并且C++的ifstream速度始终慢2-3倍.

我认为如果我们能够编译一个"技巧"存储库以提高IOStream的性能,哪些有效,哪些无效,我会觉得很棒.

要考虑的要点

  • 缓冲(rdbuf()->pubsetbuf(buffer, size))
  • 同步(std::ios_base::sync_with_stdio)
  • 区域设置处理(我们可以使用修剪后的区域设置,还是完全删除它?)

当然,欢迎其他方法.

注意:提到了Dietmar Kuhl的"新"实现,但我无法找到有关它的许多细节.以前的引用似乎是死链接.

c++ optimization iostream c++-faq c++-standard-library

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

如果忽略返回值,如何提出警告?

我想看看我的代码(C++)中忽略函数返回值的所有位置.我怎么能用gcc或静态代码分析工具呢?

代码示例错误:

int f(int z) {
    return z + (z*2) + z/3 + z*z + 23;
}


int main()
{
  int i = 7;
  f(i); ///// <<----- here I disregard the return value

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

请注意:

  • 它应该工作,即使函数及其使用在不同的文件中
  • 免费静态检查工具

c c++ gcc static-analysis

53
推荐指数
4
解决办法
1万
查看次数

Rust的逐步交互式调试器?

如何以交互方式逐步调试Rust应用程序,就像我可以在Ruby中使用"pry"一样?

我想能够在达到断点时实时查看并优选地更改变量.是否有任何生产准备完成的项目?

debugging rust

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

获取没有实例的std :: array的大小

鉴于此结构:

struct Foo {
  std::array<int, 8> bar;
};
Run Code Online (Sandbox Code Playgroud)

bar如果我没有实例,如何获取数组元素的数量Foo

c++ c++11 stdarray

49
推荐指数
3
解决办法
3047
查看次数

使用cmake处理头文件依赖项

我在一个小型的C++项目中使用CMake,到目前为止它运行得很好......有一个转折:x

当我更改头文件时,通常需要重新编译许多源文件(直接或间接包含它们的文件),但是cmake似乎只检测了一些要重新编译的源文件,从而导致状态损坏.我可以通过消除项目并从头开始重建来解决这个问题,但这绕过了使用make实用程序的目标:只重新编译所需的内容.

因此,我想我做错了什么.

我的项目非常简单有条理:

  • 所有资源都在的顶级目录,主CMakeLists.txt就在那里
  • 所有公共标题所在的"include"目录(在各个子目录中)
  • 一个"src"目录,其中源文件的所有子目录都是,src CMakeLists.txt就在那里
  • "src"目录中每个子目录的CMakeLists.txt

主目录有:

cmake_minimum_required(VERSION 2.8)

project(FOO)

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)

# Compiler Options
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++0x -Wall -Wextra -Werror")

include_directories($(FOO_SOURCE_DIR)/include)

add_subdirectory(src)
Run Code Online (Sandbox Code Playgroud)

"src"目录:

add_subdirectory(sub1)
add_subdirectory(sub2)
add_subdirectory(sub3)
add_subdirectory(sub4)

add_executable(foo main.cpp)

target_link_libraries(foo sub1 sub2 sub3 sub4)
Run Code Online (Sandbox Code Playgroud)

sub4取决于sub3哪个取决于sub2哪个取决于sub1

以及子目录(sub3)的示例:

set(SUB3_SRCS
    File1.cpp
    File2.cpp
    File3.cpp
    File4.cpp
    File5.cpp
    File6.cpp
    )

add_library(sub3 ${SUB3_SRCS})

target_link_libraries(sub3 sub1 sub2)
Run Code Online (Sandbox Code Playgroud)

我很高兴如果有人能把我的错误指向我,在这里搜索或在CMake上没有产生任何东西,所以我想这很容易或应该开箱即用......

(供参考,我在MSYS上使用cmake版本2.8.2)

编辑:

感谢Bill的建议,我已经检查了depend.makeCMake生成的文件,而且确实缺乏(严重).这是一个例子:

src/sub3/CMakeFiles/sub3.dir/File1.cpp.obj: ../src/sub3/File1.cpp
Run Code Online (Sandbox Code Playgroud)

是的,这就是所有,包括的所有内容都被引用:x

c++ dependencies cmake header-files

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