标签: object-files

什么是C中的目标文件?

我正在阅读C中的库,但我还没有找到对象文件的解释.任何其他编译文件和目标文件之间的真正区别是什么?
如果有人能用人类语言解释,我会很高兴.

c linker compilation object-files

127
推荐指数
4
解决办法
11万
查看次数

将两个GCC编译的.o对象文件合并到第三个.o文件中

如何将两个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)

compiler-construction linker gcc ld object-files

76
推荐指数
2
解决办法
5万
查看次数

如何查看目标文件中的符号?

如何查看.o文件中的符号?nm对我不起作用.我用g ++/linux.

c++ linux g++ object-files

72
推荐指数
4
解决办法
7万
查看次数

静态库的内容

我说有一个静态库mystaticlib.a.我想查看其内容,例如其中的目标文件数.

我怎么能在gcc上这样做?

c c++ gcc static-libraries object-files

44
推荐指数
3
解决办法
5万
查看次数

为什么首先编译为目标文件?

在去年,我开始在Fortran开设编程,在一所研究型大学工作.我之前的大部分经验都是使用PHP或旧ASP等网络语言,所以我是编译语句新手.

我有两个不同的代码我正在修改.

其中 有一个明确的声明创建的.o从模块文件中创建可执行文件之前(如gfortran -c filea.f90).

另一个直接创建可执行文件(有时创建.mod文件,但没有.o文件,例如gfortran -o executable filea.f90 fileb.f90 mainfile.f90).

  • 是否有一种理由(除了,也许是Makefiles)一种方法比另一种方法更受欢迎?

c c++ fortran compilation object-files

31
推荐指数
3
解决办法
8818
查看次数

.LIB和.OBJ文件有什么区别?(Visual Studio C++)

我知道.OBJ是编译一个编译单元的结果,而.LIB是一个静态库,可以从几个.OBJ创建,但这种差异似乎只是在编译单元的数量.还有其他区别吗?是相同还是不同的文件格式?

当想知道在链接到最终可执行文件期间是否合并了两个(或更多).LIB中定义的相同静态变量时,我遇到了这个问题.对于.OBJ,变量是合并的.但是在.LIBs中它是一样的吗?

c++ linker static-variables static-libraries object-files

26
推荐指数
2
解决办法
1万
查看次数

目标文件和共享对象文件之间的关系

shared object(.so)文件和object(.o)文件之间的关系是什么?

你可以通过例子解释一下吗?

c++ linker shared-libraries object-files

25
推荐指数
2
解决办法
2万
查看次数

字符串常量之前的预期unqualified-id

我目前正在编写一个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)

c++ namespaces g++ math.h object-files

24
推荐指数
2
解决办法
6万
查看次数

什么是"对象文件"中的"对象",为什么这样称呼?

我被问到一个问题:"什么是'目标文件'?".

看完Wiki后,我只知道它包含了对象.

但那些对象是什么以及为什么有人这样称呼他们呢?

c c++ linker compilation object-files

18
推荐指数
4
解决办法
8152
查看次数

在linux上使用gcc进行增量链接.可能吗?

我的团队项目的开发方式,我们从我们所有的.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,所以我假设它不可能拥有所有的目标文件.我觉得这是我可能犯了一个小错误的东西.有人有什么建议吗?提前致谢.

linux gcc ld incremental-linking object-files

17
推荐指数
2
解决办法
5830
查看次数