有没有办法不必编写两次函数声明(头文件),并且在编译时仍然保持相同的可伸缩性,调试的清晰度和在C++中编程时的设计灵活性?
当我在Linux中编写C程序,然后使用gcc编译它们时,我总是很好奇这些头文件的位置.例如,在哪里stdio.h.更一般地说,在哪里stdbool.h?
我想知道的不仅仅是它的位置,还有如何获取这些地方,例如,使用shell命令或使用C编程语言.
我仔细研究了可能的副本,但是没有任何答案在沉没.
tl; dr:源文件和头文件是如何相关的C?项目是否在构建时隐式地整理声明/定义依赖项?
我试图理解编译器如何理解.c和.h文件之间的关系.
鉴于这些文件:
header.h:
int returnSeven(void);
Run Code Online (Sandbox Code Playgroud)
source.c:
int returnSeven(void){
return 7;
}
Run Code Online (Sandbox Code Playgroud)
main.c:
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
int main(void){
printf("%d", returnSeven());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个混乱会编译吗?我目前正在使用Cygwin的gcc在NetBeans 7.0中完成我的工作,它可以自动执行大部分构建任务.编译项目时,涉及的项目文件是否根据声明中的隐含包含?source.cheader.h
它说"未找到FacebookSDK/FacebookSDK.h文件"
然而,我可以在#import上跳转到定义并将它带到文件中.
一旦我添加#import,它现在知道FBFriendPickerDelegate是什么,现在它在该行上没有错误.
我在我的项目和正确的文件夹中有facebookSDK.framework.这是SDK 3.1.我尝试将搜索路径添加到/ FacebookSDK和/FacebookSDK.framework和/ FacebookSDK/Versions/A/Headers等.我还尝试了#import"FacebookSDK.framework/Versions/A/Headers/FacebookSDK.h",它仍然说它可以找不到它.我也试过干净并重新启动.我有最新版本的Xcode.
//
// FacebookView.h
//
#import <UIKit/UIKit.h>
#import <FacebookSDK/FacebookSDK.h>
@interface FacebookView : UIViewController <FBFriendPickerDelegate>
{
}
Run Code Online (Sandbox Code Playgroud) 怎么来这个代码
std::map <std::string , int> m;
m["a"]=1;
Run Code Online (Sandbox Code Playgroud)
编译(我正在使用MSVC 2010)
#include <string>
Run Code Online (Sandbox Code Playgroud)
但没有
#include <string.h>
Run Code Online (Sandbox Code Playgroud)
?
我在一个小型的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
我从GCC 4.8.1得到一个非常奇怪的错误,内联函数.
我在头文件(debug.h和error.h)中定义了两个几乎相同的内联函数src/include/,唯一的区别是它们打印的内容 - DEBUG:消息的一个前缀,另一个%s: error: %s(程序名,错误消息).在定义内联函数和编译调试版本时(因此它设置宏DEBUG=1),我得到了许多未定义的引用错误:
src/main_debug.o
gcc -osrc/main_debug.o src/main.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1 -DBTCWATCH_VERSION="\"0.0.1\""
src/lib/btcapi_debug.o
gcc -osrc/lib/btcapi_debug.o src/lib/btcapi.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g -DCC="\"gcc\"" -DCFLAGS="\"-Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og -g\"" -DDEBUG=1
src/lib/libbtcapi_debug.a
ar rc src/lib/libbtcapi_debug.a src/lib/btcapi_debug.o
ranlib src/lib/libbtcapi_debug.a
src/lib/cmdlineutils_debug.o
gcc -o src/lib/cmdlineutils_debug.o src/lib/cmdlineutils.c -c -Wall -Wextra -Wpedantic -std=gnu11 -march=native -Og …Run Code Online (Sandbox Code Playgroud) 该工具include-what-you-use可用于检测不需要的标头.我正在使用CMake来完成我的C++软件项目.如何指示CMake在我的软件项目的源文件上自动运行包含什么?
header-files ×10
c++ ×6
c ×4
cmake ×2
header ×2
assert ×1
compilation ×1
dependencies ×1
function ×1
gcc ×1
inline ×1
linux ×1
string ×1
undefined ×1
xcode ×1