大家好:快速问题:我的情况是只使用'gcc'(没有g ++)生成我的C++可执行文件是有用的.原因是我必须将代码提交给自动提交服务器,该服务器无法识别'g ++'(或'c ++',就此而言)命令.
在我的实验中,虽然我正在编译 gcc工作得很好.问题是,当我尝试链接生成的目标文件时,它会搞砸.现在,基于我从gcc手册页中所理解的内容(我可能会离开,所以告诉我,如果我),g ++基本上是gcc,但它链接了C++库.
如果是这样,我怎么能(如果可能的话)显式链接C++库而不使用g ++(或c ++)命令?
编辑:我正在添加makefile以更好地说明问题:
COMPILER = gcc
CFLAGS = -Wall -g -x c++
# MODULE COMPILATION
model: modules/model.h modules/sources/model.cpp
$(COMPILER) $(CFLAGS) -c modules/sources/model.cpp -o obj/model.o
algorithms: modules/algorithms.h modules/sources/algorithms.cpp
$(COMPILER) $(CFLAGS) -c modules/sources/algorithms.cpp -o obj/algorithms.o
io: modules/io.h modules/sources/io.cpp
$(COMPILER) $(CFLAGS) -c modules/sources/io.cpp -o obj/io.o
stopwatch: modules/stopwatch.h modules/sources/stopwatch.cpp
$(COMPILER) $(CFLAGS) -c modules/sources/stopwatch.cpp -o obj/stopwatch.o
# EXECUTABLE GENERATION
exe: model algorithms io stopwatch
$(COMPILER) $(CFLAGS) main.cpp obj/model.o obj/algorithms.o obj/io.o obj/stopwatch.o -o bin/process …Run Code Online (Sandbox Code Playgroud) 我想知道何时应该使用ld链接器代替gcc.我刚用c ++写了一个简单的hello world,当然我包含了iostream库.如果我想用gcc制作一个二进制文件,我只需使用:
g++ hello hello.cpp
我有我的二进制文件.
后来我尝试使用ld链接器.要获取目标文件我使用:
g++ -c hello.cpp.好的,这很简单,但链接命令很糟糕:
ld -o hello.out hello.o \
-L /usr/lib/gcc/x86_64-linux-gnu/4.8.4/ \
/usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtbegin.o \
/usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtend.o \
/usr/lib/x86_64-linux-gnu/crti.o \
/usr/lib/x86_64-linux-gnu/crtn.o \
/usr/lib/x86_64-linux-gnu/crt1.o \
-dynamic-linker /lib64/ld-linux-x86-64.so.2 -lstdc++ -lc
Run Code Online (Sandbox Code Playgroud)
我知道gcc 使用ld的事实.gcc在所有情况下或仅在大多数情况下使用更好?请告诉我有关ld链接器有优势的案例的一些想法.
我正在构建一个微型微控制器,其中只包含用于自学目的的基本要素.通过这种方式,我可以刷新我对linkerscript,启动代码等主题的了解......
编辑:
我收到了很多评论,指出下面显示的"绝对最小STM32应用"并不好.当你注意到向量表不完整,.bss-section没有处理,外围地址不完整时,你是完全正确的,...请允许我解释原因.
作者的目的从未在本章中编写完整且有用的应用程序.他的目的是逐步解释链接器如何工作,启动代码如何工作,STM32的启动过程是什么样的,......纯粹用于教育目的.我可以欣赏这种方法,并学到了很多东西.
我在下面的例子取自相关章节的中间部分.本章继续向linkerscript和启动代码添加更多部分(例如初始化.bss-section).
我从他的章节中间放置文件的原因是因为我遇到了特定的错误消息.我想在继续之前解决这个问题.
有问题的章节在他书的最后.它适用于想要获得更多人们甚至不考虑的主题的更有经验或好奇的读者(大多数人使用制造商给出的标准linkerscript和启动代码而不读它).
请记住这一点,请让我们关注手头的技术问题(如下面的错误消息中所述).也请接受我真诚的道歉,我之前没有澄清作者的意图.但我现在已经完成了,所以我们可以继续前进;-)
我正在阅读的教程是本书的第20章:"掌握STM32"(https://leanpub.com/mastering-stm32).该书解释了如何使用两个文件制作一个微型微控制器应用程序:main.c和linkerscript.ld.由于我没有使用IDE(如Eclipse),我还添加build.bat并clean.bat生成编译命令.所以我的项目文件夹看起来像这样:
在继续之前,我应该提供一些关于我的系统的更多细节:
操作系统: Windows 10,64位
微控制器:带STM32F401RE微控制器的NUCLEO-F401RE板.
编译器: arm-none-eabi-gcc版本6.3.1 20170620(发布)[ARM/embedded-6-branch revision 249437].
主文件如下所示:
/* ------------------------------------------------------------ */
/* Minimal application */
/* for NUCLEO-F401RE */
/* ------------------------------------------------------------ */
typedef unsigned long uint32_t;
/* Memory and peripheral start addresses (common to all STM32 MCUs) */
#define FLASH_BASE 0x08000000
#define SRAM_BASE 0x20000000
#define PERIPH_BASE 0x40000000
/* …Run Code Online (Sandbox Code Playgroud) 我正在学习如何使用汇编语言(顺便说一句在Raspberry Pi上),并且想知道使用gcc和as进行编译之间有什么区别。
到目前为止,我注意到的差异是:
as。as似乎比单独识别要好gcc。gcc在使用整数除法之类的指令之前,我必须告诉架构。gcc我可以很方便地在C标准库函数。我认为可以使用,as但我还没有弄清楚。我想坚持使用特定的编译器。我应该知道还有什么其他区别。使用这两种方法都有优点/缺点吗?