大约一年前,我询问了CMake中的头依赖关系.
我最近意识到问题似乎是CMake认为那些头文件是项目外部的.至少,在生成Code :: Blocks项目时,头文件不会出现在项目中(源文件会出现).因此,在我看来,CMake认为这些标题是项目的外部,并且不会在依赖项中跟踪它们.
在CMake教程中快速搜索只指出include_directories哪个似乎没有我想做的...
向CMake发出信号通知特定目录是否包含要包含的标头的正确方法是什么,并且生成的Makefile应该跟踪这些标头?
在C++中,可以static在翻译单元中使用关键字来影响符号的可见性(变量或函数声明).
在n3092,这被弃用了:
附件D.2 [depr.static]
在命名空间范围内声明对象时,不推荐使用static关键字(见3.3.6).
在n3225中,这已被删除.
它确实强调,为了与C兼容(以及将C程序编译为C++的能力),弃用令人讨厌.但是,直接将C程序编译为C++本身就是一种令人沮丧的经历,所以我不确定它是否值得考虑.
有谁知道为什么它被改变了?
我刚刚被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
我不太熟悉C标准,所以请耐心等待.
我想知道,按标准保证memcpy(0,0,0)是否安全.
我能找到的唯一限制是,如果内存区域重叠,那么行为是未定义的......
但我们可以认为这里的内存区域重叠吗?
大多数学习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++)中忽略函数返回值的所有位置.我怎么能用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)
请注意:
如何以交互方式逐步调试Rust应用程序,就像我可以在Ruby中使用"pry"一样?
我想能够在达到断点时实时查看并优选地更改变量.是否有任何生产准备完成的项目?
鉴于此结构:
struct Foo {
std::array<int, 8> bar;
};
Run Code Online (Sandbox Code Playgroud)
bar如果我没有实例,如何获取数组元素的数量Foo?
我在一个小型的C++项目中使用CMake,到目前为止它运行得很好......有一个转折:x
当我更改头文件时,通常需要重新编译许多源文件(直接或间接包含它们的文件),但是cmake似乎只检测了一些要重新编译的源文件,从而导致状态损坏.我可以通过消除项目并从头开始重建来解决这个问题,但这绕过了使用make实用程序的目标:只重新编译所需的内容.
因此,我想我做错了什么.
我的项目非常简单有条理:
主目录有:
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++ ×8
c ×3
c++11 ×2
cmake ×2
c++-faq ×1
crash ×1
debugging ×1
dependencies ×1
function ×1
gcc ×1
header-files ×1
iostream ×1
memcpy ×1
null-pointer ×1
optimization ×1
rust ×1
standards ×1
static ×1
stdarray ×1
ubuntu ×1
visual-c++ ×1