我正在阅读C中的库,但我还没有找到对象文件的解释.任何其他编译文件和目标文件之间的真正区别是什么?
如果有人能用人类语言解释,我会很高兴.
如何将两个GCC编译的.o对象文件合并到第三个.o文件中?
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable
Run Code Online (Sandbox Code Playgroud)
如果您有权访问源文件,-combineGCC标志将在编译之前合并源文件:
$ gcc -c -combine a.c b.c -o c.o
Run Code Online (Sandbox Code Playgroud)
但是,这仅适用于源文件,并且GCC不接受.o文件作为此命令的输入.
通常,链接.o文件无法正常工作,因为您无法使用链接器的输出作为输入.结果是共享库,并且不会静态链接到生成的可执行文件中.
$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit …Run Code Online (Sandbox Code Playgroud) 我说有一个静态库mystaticlib.a.我想查看其内容,例如其中的目标文件数.
我怎么能在gcc上这样做?
在去年,我开始在Fortran开设编程,在一所研究型大学工作.我之前的大部分经验都是使用PHP或旧ASP等网络语言,所以我是编译语句的新手.
我有两个不同的代码我正在修改.
其中 有一个明确的声明创建的.o从模块文件中创建可执行文件之前(如gfortran -c filea.f90).
另一个是直接创建可执行文件(有时创建.mod文件,但没有.o文件,例如gfortran -o executable filea.f90 fileb.f90 mainfile.f90).
我知道.OBJ是编译一个编译单元的结果,而.LIB是一个静态库,可以从几个.OBJ创建,但这种差异似乎只是在编译单元的数量.还有其他区别吗?是相同还是不同的文件格式?
当想知道在链接到最终可执行文件期间是否合并了两个(或更多).LIB中定义的相同静态变量时,我遇到了这个问题.对于.OBJ,变量是合并的.但是在.LIBs中它是一样的吗?
shared object(.so)文件和object(.o)文件之间的关系是什么?
你可以通过例子解释一下吗?
我目前正在编写一个C++应用程序,它与math.h一起实现了一个振荡器.我的代码应该适用于应用程序(尝试编译目标文件),我得到的编译器错误很可能与语法/等有关; 我认为它与命名空间有关.错误:
终端输出:
User-Name-Macbook-Pro:Synth Parts UserName$ make
g++ -o Oscillators.o -c -I. Oscillators.cpp -c
In file included from Oscillators.cpp:2:
/usr/include/math.h:41: error: expected unqualified-id before string constant
In file included from /usr/include/c++/4.2.1/bits/locale_facets.tcc:42,
from /usr/include/c++/4.2.1/locale:46,
from /usr/include/c++/4.2.1/bits/ostream.tcc:46,
from /usr/include/c++/4.2.1/ostream:635,
from /usr/include/c++/4.2.1/iostream:45,
from Oscillators.cpp:4:
/usr/include/c++/4.2.1/typeinfo:41: error: expected declaration before end of line
make: *** [Oscillators.o] Error 1
Run Code Online (Sandbox Code Playgroud)
Oscillators.cpp
#include "Oscillators.h"
#include <math.h>
#include <vector>
#include <iostream>
#define TWOPI (6.2831853072)
using namespace std;
oscillator(int srate = 44100, int tabsize = 8192, double freq = …Run Code Online (Sandbox Code Playgroud) 我的团队项目的开发方式,我们从我们所有的.o目标文件为我们的应用程序生成一个共享对象库.我的任务(希望它足够具体,但也足够通用以供其他人使用!)是仅链接自上次创建可执行文件以来已更改的目标文件.例如,这是我用来构建.so的命令行:
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o libMySharedLibrary.so
Run Code Online (Sandbox Code Playgroud)
哪个按预期工作!:)我的目标是从现在开始只能链接更改的目标文件,以加快并发链接过程.示例命令是:
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o libMySharedLibrary.so
Run Code Online (Sandbox Code Playgroud)
哪个会libMySharedLibrary.so使用较新的目标文件进行更新,同时libMySharedLibrary.so还要保留较旧的目标文件.实际上,当我libMySharedLibrary.so使用上面的命令生成时,文件大小比包含所有目标文件的文件大小小得多,所以我几乎可以确定上面的命令没有按照我的意愿行事.
通过我的研究,我发现-i链接器有一个选项与-r选项相同,它似乎只是将所有目标文件组合成一个大对象文件.不幸的是,这似乎不是我想要的.
简而言之,我想在初始链接之后仅链接更改的目标文件,从而为将来的链接提供更快的链接过程.有没有办法做到这一点?
编辑:我尝试过的一个例子-i/-r:
示例命令: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o
我不得不添加-nostdlib标签以阻止它向我大吼大叫需要它,并删除-shared因为-r标签不允许共享对象.
这个命令似乎将我的所有.o文件都压缩成一个大的.o文件.所以,如果我只能从改变的.o文件那里更新那个.o文件,那就太好了.在最初创建AllMyObjects.o之后,我尝试了这个命令:g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o,但它也会创建一个更小的(文件大小)AllMyObjects.o,所以我假设它不可能拥有所有的目标文件.我觉得这是我可能犯了一个小错误的东西.有人有什么建议吗?提前致谢.
object-files ×10
c++ ×7
linker ×5
c ×4
compilation ×3
gcc ×3
g++ ×2
ld ×2
linux ×2
fortran ×1
math.h ×1
namespaces ×1