我有一个使用qmake的Qt项目.为了提高清晰度和可读性,我想保留
分离.
所以我的第一步是将源文件放入src/sub目录:
myproject/
myproject.pro
src/
main.cpp
MainWindow.ui
...
Run Code Online (Sandbox Code Playgroud)
这样我就将源文件与构建系统(*.pro)分开了.然而,当我然后运行qmake其次make,将所生成的文件(目标文件等)被放置到主项目文件夹中:
myproject/
myproject.pro
Makefile
main.o
ui_MainWindow.h
...
src/
main.cpp
MainWindow.ui
...
Run Code Online (Sandbox Code Playgroud)
好吧,至少他们没有被放入src/文件夹,但我如何指定他们被放入另一个子文件夹,如build/?
myproject/
myproject.pro
Makefile
build/
main.o
ui_MainWindow.h
...
src/
main.cpp
MainWindow.ui
...
Run Code Online (Sandbox Code Playgroud)
(顺便说一下,我不关心目标二进制文件myproject放在哪里,但我想它应该直接放在项目文件夹中而不是放入build/.)
就像标题所说,"程序对象文件"(.o扩展名)和"库文件"(.so扩展名)之间有什么区别
是否可以将从.c源代码创建的目标文件.o转换为.exe?如果可能有使用gcc的直接命令?
我正在尝试使用64位Mac OS X Lion运行基本的汇编文件,使用默认安装Xcode的nasm和ld.
我编写了一个汇编文件,它打印了一个字符,然后我使用nasm构建它.
nasm -f elf -o program.o main.asm
但是,当我将它与ld链接时,它会因为相当多的错误/警告而失败:
ld -o program program.o
ld: warning: -arch not specified
ld: warning: -macosx_version_min not specificed, assuming 10.7
ld: warning: ignoring file program.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
ld: warning: symbol dyld_stub_binder not found, normally in libSystem.dylib
ld: entry point (start) undefined. Usually in crt1.o for inferred architecture x86_64
Run Code Online (Sandbox Code Playgroud)
所以,我试图纠正其中的一些问题,并没有取得任何进展.
这是我尝试过的一件事:
ld -arch i386 -e _start -o program program.o
我认为这会奏效,但我错了. …
在查看LLVM源代码中的错误修复时,我遇到了"虚拟部分"一词,并想知道它的含义.
我尝试使用谷歌搜索一些不同的术语并进一步浏览源代码,但我设法发现的是,每个目标文件格式的isSectionVirtual成员函数的实现似乎表示如果一个部分没有内容(例如.bss,则该部分是虚拟的)部分,但源代码清楚地表明这是两个不同的概念).实现方式因所涉及的特定对象格式而异.
我对理解目标文件的内部结构还是比较陌生的,所以我不确定这是LLVM还是LLVM之外的更一般的概念.
有人可以告诉我目标文件中的虚拟部分是什么吗?
有没有我可以用OMF对象格式获得Windows的预编译BLAS和LAPACK二进制文件?我想将一些D语言代码链接到这些.我知道在哪里可以获得COFF格式的相关库.我也知道objconv工具,它将COFF转换为OMF,尽管由于我不完全理解的原因,这似乎在实践中不起作用.这些似乎与符号中的下划线有关,尽管我尝试了几乎每个设置来处理这些并且似乎都没有.
或者,是否有人知道如何将引用二进制文件转换为OMF,以便它们实际上可以正确链接到DMD编译的代码?作为最后的手段,有谁知道如何使用DMC构建CLAPACK,CBLAS和F2CLIB?这些附带的构建过程似乎完全面向GCC工具链.
我正在为Java的一个子集编写编译器boost::spirit,用于lexing和解析.在编译词法分析器/解析器阶段期间,编译器消耗1.6GBRAM(g++ (GCC) 4.8.1),但这不是问题,因为这台机器上有足够的内存.
然而,问题在于,当编译器完成并且汇编程序开始运行(GNU assembler (GNU Binutils) 2.23.52.20130604)时,它会崩溃;
as: build/src/ast_generate.o: too many sections (33098)
/tmp/cc0ZyvKK.s: Assembler messages:
/tmp/cc0ZyvKK.s: Fatal error: can't write build/src/ast_generate.o: File too big
as: build/src/ast_generate.o: too many sections (33098)
/tmp/cc0ZyvKK.s: Fatal error: can't close build/src/ast_generate.o: File too big
scons: *** [build/src/ast_generate.o] Error 1
Run Code Online (Sandbox Code Playgroud)
添加'-Os'到我的编译器标志,允许汇编程序处理编译器输出,但正如我所看到的,这只是时间问题,直到我遇到同样的问题,即使使用小优化标志.
检查,使用大小优化的对象文件(ast_generate.o)objdump告诉我,我正在生成pe-x86-64,这是我在Windows上所期望的.
然而,2358生成的部分对我来说是一个震惊.主要是因为似乎已经为每个部分生成了一个部分boost::spirit;
CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_DISCARD
...
60 .pdata$_ZNK5boost5lexer6detail8end_node9unique_idEv 0000000c 0000000000000000 …Run Code Online (Sandbox Code Playgroud) 更具体地说,假设两个编译器都在同一平台上(OS +指令集).但是,其中一个目标文件是由依赖于编译器的代码构成的.另一方面 - 代码是面向对象的并且尊重封装.
我需要这个用于我正在制作的一种框架.目标平台是GCC和Java虚拟机的任何系统.实际上,该框架将在每个平台上编译.使用框架用户的编译器取决于他.
每当我们编译c ++文件时,都会生成一个obj文件.我想知道obj文件的大小取决于哪些因素?
只是为了让我的问题更清楚,例如,一个c ++文件包含一个类声明,这个类有一个整数变量作为数据成员,并且还有一些成员函数.如果我编译这个文件,那么将创建一些某些X大小的obj文件.现在假设我添加了更多数据成员和成员函数,那么obj文件的大小会改变吗?
编译代码时,会生成一个目标文件.从该目标文件中,在链接过程中生成可执行文件.
为什么我们需要一个目标文件?对象文件的用途是什么?难道不可能直接生成可执行文件吗?毕竟,我们正在使用可执行文件来运行程序.