我编写空程序来惹恼stackoverflow程序员的地狱,不是.我正在探索gnu工具链.
现在以下对我来说可能太深了,但是为了继续执行空程序传奇,我已经开始检查C编译器的输出,GNU作为消耗的东西.
gcc version 4.4.0 (TDM-1 mingw32)
Run Code Online (Sandbox Code Playgroud)
test.c的:
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc -S test.c
.file "test.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
call ___main
movl $0, %eax
leave
ret
Run Code Online (Sandbox Code Playgroud)
你能解释一下这里发生的事吗?这是我努力理解它.我使用了as
手册和我的最小x86 ASM知识:
.file "test.c"
是逻辑文件名的指令..def
:根据文档"开始定义符号名称的调试信息".什么是符号(函数名称/变量?)以及什么样的调试信息?.scl
:docs说"存储类可以标记符号是静态的还是外部的".这是我从C中知道的静态和外部吗?什么是'2'?.type
:存储参数"作为符号表条目的类型属性",我不知道..endef
: 没问题..text
:现在这是有问题的,它似乎是一个叫做section的东西,我已经读过它的代码所在,但是文档并没有告诉我太多. …我一直在用C++测试内联函数调用.
Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)
Run Code Online (Sandbox Code Playgroud)
C++编程语言中的Stroustrup:
内联说明符是编译器的一个提示,它应该尝试生成代码内联,而不是为函数设置一次代码,然后通过通常的函数调用机制调用.
但是,我发现生成的代码根本不是内联的.有一个CALL为instrction 国际广场的功能.
替代文字http://i42.tinypic.com/8ys3f4.jpg
为什么会这样?那我怎么能使用内联函数呢?
编辑:使用的命令行选项:
**** Build of configuration Debug for project InlineCpp ****
**** Internal Builder is used for build ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\InlineCpp.o ..\src\InlineCpp.cpp
g++ -oInlineCpp.exe src\InlineCpp.o
Run Code Online (Sandbox Code Playgroud) 我是新手,昨天我安装了Win 8.1 x64,所以我想用最合适的程序在C/C++中完成我的任务.谢谢
test.c:
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我没有使用任何标志(我是gcc的新手),只是命令:
gcc test.c
Run Code Online (Sandbox Code Playgroud)
我在win32上使用了最新的GDM TDM版本.生成的可执行文件几乎是23KB,对于空程序来说太大了.
如何减小可执行文件的大小?
我有一个C++程序,我用mingw编译(gcc for Windows).使用包含gcc 4.4.1的mingw的TDM版本.可执行文件链接到两个静态库(.a)文件:它们是用C编写的第三方库; 另一个是由我编写的C++库,它使用C库提供我自己的C++ API.
在我看来,(在我看来,过多)部分C库的功能是在内联函数中实现的.当你使用C库的API时,你无法避免包含内联函数,但当我尝试将它们全部链接在一起时,我会收到链接错误,说明所有内联函数都有多个定义 - 我都有在我的C++包装器库中调用,而我没有调用它,基本上在头文件中内联定义的任何内容都在C库和C++库中为它创建了一个函数.
当包含文件在同一项目中的不同.c或.cpp文件中多次使用时,它不会导致多个定义错误; 问题只是它为每个库生成一个定义.
编译器如何/为什么在两个库中为这些内联函数生成函数和符号?如何强制它停止在我的代码中生成它们?是否有一个工具可以运行以从.a文件中删除重复的函数,或者是一种使链接器忽略多个定义的方法?
(仅供参考,第三方库在其所有标题中都包含#ifdef __cplusplus和extern"C"保护;无论如何,如果这是问题,它不会导致符号的多重定义,它会导致相反的问题,因为符号会不确定或至少不同.)
值得注意的是,如果我链接到第三方C库的DLL,则不会发生链接错误; 然而,我得到奇怪的运行时故障似乎与我的代码有关,它应该从DLL调用自己的函数版本.(好像编译器正在创建我没有要求的本地版本的函数.)
之前已经问过这个问题的类似版本,但是,我没有找到任何这些问题的答案:
这个问题的答案是海报是多个定义变量,我的问题是内联函数的多重定义: 重复多重定义错误在多个cpps中包含相同的标题
这是一个MSVC计划,但我正在使用mingw; 另外,海报在这个问题中的问题是在标题中类主体之外定义C++类构造函数,而我的问题是内联的C函数: 静态Lib多重定义问题
这个傻瓜将他的所有C代码重命名为C++文件,他的C代码不是C++ - 安全:链接时 多个std :: functions的多个定义
这个只是想知道为什么违反一个定义规则不是错误: 具有不同定义的内联函数的不可预测的行为
在Windows XP上,使用TDM的GCC/MinGW32进行基本开发,即使用gdb的gcc 4.4.x. 哪个单元测试框架用于测试驱动开发?
显然Check的单元测试还没有在Windows上运行.
在这些问题的单元测试框架对于C和单元测试C代码类似,但没有具体关于在Windows上使用GCC 4.4.x到.
我最近升级到GCC 4.4(MinGW TDM版本),现在跟随代码产生这些警告:
在成员函数'void Console :: print(const std :: string&)'中:
警告:数组下标在数组边界之上
这是代码:
void Console::print( const std::string& str ) {
std::string newLine( str );
if( newLine.size() > MAX_LINE_LENGTH ) {
sf::Uint32 stringSize = newLine.size();
for( sf::Uint32 insertPos = MAX_LINE_LENGTH;
insertPos < stringSize; insertPos += MAX_LINE_LENGTH ) {
newLine.insert( insertPos, "\n" );
}
}
StringList tokens;
boost::split( tokens, newLine, boost::is_any_of("\n") );
for( StringList::iterator it = tokens.begin();
it != tokens.end(); ++it ) {
addLine( *it );
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这是优化正在做...
它似乎是这条线导致它:
boost::split( tokens, …
Run Code Online (Sandbox Code Playgroud) 我编写的程序使用SFML但在运行时失败,因为libgcc_s_dw2-1.dll
缺少.我正在使用tdm-gcc,无法在我的计算机上的任何地方找到该文件,重新安装没有帮助,一个简单的hello world programm工作正常,所以我不确定为什么它需要这个dll.
哪个mingw包可以找到?我在网站上搜索过,但无法找到它.抱歉,如果我错过了一个明显的搜索结果,但这令人非常沮丧!在此先感谢,ell.
PS顺便说一句,我在64位Windows 7上
编辑:对不起,我忘了提到我已经阅读了同一问题的另一个问题的答案,但正如我所说,我无法在我的计算机,bin
目录或其他任何地方找到该文件.此外,通过-static-libgcc
与-static-libstdc++
编译器和/或链接给我unrecognized option '-static-libstdc++'
.很抱歉没有澄清我已经读过这个.谢谢!
我需要在Win64 for Win64上构建一个简单的非商业工具(处理Windows GDI API)(没有交叉编译).MinGW对我来说似乎是最好的选择.
我以前已经使用过32位版本,对于64位版本,您能否告诉我以下版本之间的主要区别?:
除了经典的MinGW32使用简单的工具,mingw-get.exe
自定义设置并跟上更新周期.现在哪个是等价的?
突然间,当使用基于通配符的文件名时,我似乎很难从 Windows(特别是 10)上的命令行编译 C++ 程序(特别是 TDM64 5.1.0)。当给出完整的名称时,效果很好。我以前已经做过无数次了,没有任何问题编辑:但通常不是在 Windows 上......我之前对这个工作的记忆一定是错误的。我缺少什么?
\n\n\nRun Code Online (Sandbox Code Playgroud)\nC:\\Users\\Duncan Coulter\\Code>dir *.cpp\n Volume in drive C has no label.\n Volume Serial Number is 9EE6-DBBD\n\n Directory of C:\\Users\\Duncan Coulter\\Code\n\n2016/04/04 01:35 PM 7\xc2\xa0869 LittleMan.cpp\n2016/04/04 01:35 PM 1\xc2\xa0912 main.cpp\n 2 File(s) 9\xc2\xa0781 bytes\n 0 Dir(s) 90\xc2\xa0288\xc2\xa0394\xc2\xa0240 bytes free\n\nC:\\Users\\Duncan Coulter\\Code>g++ *.cpp\ng++: error: *.cpp: Invalid argument\n\nC:\\Users\\Duncan Coulter\\Code>g++ main.cpp LittleMan.cpp\n
我正在挠头,试图找出为什么在我的机器上构建Boost库时不会生成导入库.更具体地说,构建DLL工作正常,但我以前(即在我重新安装我的机器之前)正确生成导入库.
一些规格:
gcc
MS Dos命令行提示符的工具集构建调用bjam.exe的命令行如下所示:
"C:\.../boost_1_33_1/tools/build/jam_src/bin.ntx86/bjam.exe" --debug-configuration -d2 -q --builddir=C:/.../trunk/XTemp/gcc.debug/boost_1_33_1 toolset=gcc threading=multi define=BOOST_WINDOWS define=_GLIBCXX__PTHREADS linkflags=-shared-libgcc runtime-link=shared variant=debug --v2 linkflags=-out-implib=boost_thread.lib
Run Code Online (Sandbox Code Playgroud)
这曾经很好地工作,并产生了所需的文件boost_thread.lib
,但现在不再.我真的不知道发生了什么,我想确切地知道链接器在命令行上收到了什么以及它认为它应该用它做什么.
谢谢,
卡尔
试图在XP SP3上运行TDM-GCC(4.7.1) - 我现在只需要一个c ++ 32bit版本.似乎windres的格式不正确,我的.rc文件失败了:
x86_64-w64-mingw32-g++.exe -Wall -m32 -s -D_M_X86 -DBUILD_DLL -DNDEBUG -c C:\SynthEditSDK\TD_SV\SV.cpp -o obj\Release\TD_SV\SV.o
windres.exe -J rc -O coff -i C:\SYNTHE~1\TD_SV\TD_SV.rc -o obj\Release\TD_SV\TD_SV.res
x86_64-w64-mingw32-g++.exe -shared -Wl,--output-def=bin\Release\libTD_SV -Wl,--out-implib=bin\Release\libTD_SV -Wl,--dll obj\Release\se_sdk3\mp_sdk_audio.o obj\Release\se_sdk3\mp_sdk_common.o obj\Release\TD_SV\SV.o obj\Release\TD_SV\TD_SV.res -o bin\Release\TD_SV.sem -Wl,--kill-at -static-libgcc -m32 -luser32
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: i386:x86-64 architecture of input file `obj\Release\TD_SV\TD_SV.res' is incompatible with i386 output
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 2 seconds)
0 errors, 2 warnings (0 minutes, 2 seconds)
Run Code Online (Sandbox Code Playgroud)
我的资源文件(TD_SV.rc)似乎是错误:
TD_SV.res' is …
Run Code Online (Sandbox Code Playgroud) 我已经在很多网站上搜索过这个,但都失败了。但是TDM在“TDM-gcc”中代表什么?当我想选择 gcc 作为编译器时,我很困惑。那么,有什么区别呢?我应该选择TDM还是NON-TDM?还是 TDM 仅适用于 minGW?在 Windows 平台上?
官方 TDM-gcc 站点甚至不解释它...