比方说,我有许多预处理指令源文件.是否有可能看到它的外观预处理器是用它做之后?
C++链接如何在实践中发挥作用?我正在寻找的是关于链接如何发生的详细解释,而不是链接的命令.
关于编译已经有类似的问题,但没有详细说明:编译/链接过程如何工作?
如果它们都包含已编译的代码,为什么我们不能在运行时加载"静态"文件,为什么我们不能在编译时链接动态库?为什么需要单独的格式来包含"独立"代码?什么需要存储哪个保证差异?
在调试我的代码时,我经常想知道#defined'd常量的值.但调试器似乎并不知道它们的值.这意味着我必须围绕查看包含路径等来查找#define行.是否有一些技巧可以让这更容易?
更新:我不得不向Tony D授予绿色标记以详细回答标题问题,但我也赞成使用const
而不是#define(我也测试了它enum
也有效).最后使用F12找到原来的#define线是另一个好主意.
我刚刚写了一个包含一些静态数据成员的类,但现在我收到有关"未定义引用"的错误.为什么这不起作用?我究竟做错了什么?
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
有没有人引用海报/单页pdf或类似的东西与C语言的八个翻译阶段列表(第一个是三字母翻译)?我想在我的电脑旁边的墙上挂一个印刷品.
更新:抱歉忘记指定.我对C90很感兴趣(虽然C99可能非常接近,_Pragma
如pmg所说,答案是C99特定的,我想避免这种情况).
我在VC++ 2008中的程序有问题.当我编译它时,会列出以下错误.我花了很多时间在groups.google.com上查找原因,但没有评论帮助我.有人知道问题是什么吗?谢谢.
error LNK2001: unresolved external symbol "long rfl_xref_id" (?rfl_xref_id@@3JA)
error LNK2001: unresolved external symbol "struct obj_name * pat_objname_list" (?pat_objname_list@@3PAUobj_name@@A)
error LNK2001: unresolved external symbol "struct obj_name * pat_recall_objname_list" (?pat_recall_objname_list@@3PAUobj_name@@A)
error LNK2001: unresolved external symbol "wchar_t * rfl_unresolved_xref_tag" (?rfl_unresolved_xref_tag@@3PA_WA)
error LNK2001: unresolved external symbol "struct ref_pages * rfl_pages" (?rfl_pages@@3PAUref_pages@@A)
error LNK2001: unresolved external symbol "short rfl_use_regen_id" (?rfl_use_regen_id@@3FA)
error LNK2001: unresolved external symbol "long rfl_regen_id" (?rfl_regen_id@@3JA)
error LNK2001: unresolved external symbol "unsigned short rfl_list_status" (?rfl_list_status@@3GA)
error LNK2001: unresolved external symbol "unsigned …
Run Code Online (Sandbox Code Playgroud) 根据我所阅读和理解的内容,#include
源文件中的指令(例如ex:)main.cpp
只是将包含文件的内容复制到.cpp
.因此,当我包含头文件时,对于ex:,yum.h
所有语句yum.h
都被复制到main.cpp
.
头文件只有声明,实际定义将在相应的.cpp
文件中,如yum.cpp
.
因此,在编译时main.cpp
,如何将编译器知道要查找提及任何函数的定义yum.h
中yum.cpp
?编译器如何知道如何编译yum.cpp
文件,因为在main.cpp
文件或文件中都没有引用它yum.h
.
另外,为什么要yum.h
加入yum.cpp
?
这听起来像是一个愚蠢的问题.我是OOP和C++的初学者,我只是想了解发生了什么.
我已经完成了一些boost和它拥有的库的教程.
我浏览了基本的boost教程:
http://www.boost.org/doc/libs/1_52_0/more/getting_started/unix-variants.html
Run Code Online (Sandbox Code Playgroud)
它工作得很好.我遇到了asio教程的问题:
http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/tutorial/tutdaytime1/src.html
Run Code Online (Sandbox Code Playgroud)
它看起来像链接错误,但我包含与以前相同的路径:
g++ -I /usr/local/boost_1_52_0 test.cpp -o example
Run Code Online (Sandbox Code Playgroud)
错误:
/tmp/cce4EZME.o: In function `__static_initialization_and_destruction_0(int, int)':
test.cpp:(.text+0x57b): undefined reference to `boost::system::generic_category()'
test.cpp:(.text+0x587): undefined reference to `boost::system::generic_category()'
test.cpp:(.text+0x593): undefined reference to `boost::system::system_category()'
/tmp/cce4EZME.o: In function `boost::system::error_code::error_code()':
test.cpp:(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC5Ev]+0x17): undefined reference to `boost::system::system_category()'
/tmp/cce4EZME.o: In function `boost::asio::error::get_system_category()':
test.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[_ZN5boost4asio5error19get_system_categoryEv]+0x5): undefined reference to `boost::system::system_category()'
/tmp/cce4EZME.o: In function `boost::asio::detail::posix_thread::~posix_thread()':
test.cpp:(.text._ZN5boost4asio6detail12posix_threadD2Ev[_ZN5boost4asio6detail12posix_threadD5Ev]+0x26): undefined reference to `pthread_detach'
/tmp/cce4EZME.o: In function `boost::asio::detail::posix_thread::join()':
test.cpp:(.text._ZN5boost4asio6detail12posix_thread4joinEv[_ZN5boost4asio6detail12posix_thread4joinEv]+0x2b): undefined reference to `pthread_join'
/tmp/cce4EZME.o: In function `boost::asio::detail::posix_thread::start_thread(boost::asio::detail::posix_thread::func_base*)':
test.cpp:(.text._ZN5boost4asio6detail12posix_thread12start_threadEPNS2_9func_baseE[_ZN5boost4asio6detail12posix_thread12start_threadEPNS2_9func_baseE]+0x29): undefined reference to `pthread_create'
collect2: error: …
Run Code Online (Sandbox Code Playgroud) 我理解编译过程的方式:
1)预处理:所有宏都替换为实际值,删除所有注释等.用您包含的文件的文字文本替换#include语句.
2)编译:这里不会深入挖掘,但结果是您所在的任何架构的汇编文件.
3)汇编:获取汇编文件并将其转换为二进制指令,即机器代码.
4)链接:这是我困惑的地方.此时你有一个可执行文件.但是,如果您实际运行该可执行文件会发生什 问题是你可能包含*.h文件,那些只包含函数原型?因此,如果您实际调用这些文件中的一个函数,它将没有定义,您的程序将崩溃?
如果是这样的话,那引信到底是做什么的呢?它如何找到与您包含的.h相关联的.c文件,以及它如何将其注入到您的机器代码中?是否必须再次为该文件完成整个编译过程?
现在,我已经明白有两种类型的链接,动态和静态.当你为你创建的每个可执行文件重新编译库的源代码时是静态的吗?我不太明白动态链接是如何工作的.那么您编译一个可由您使用它的所有进程共享的可执行库?这怎么可能呢?它不会在尝试访问它的进程的地址空间之外吗?另外,对于动态链接,您是否仍需要在某个时刻编译库?是不是只是坐在那里等待使用?什么时候编译?
您是否可以通过上述内容清除所有误解,错误的假设并替换您正确的解释?