标签: object-files

将对象文件链接到我的项目Eclipse CDR

我正在从学校开展一个项目,我们得到了一个.o和一个相应的.h文件.我们需要在.c程序中使用.o文件中的几个函数.只是将它放在同一目录中是行不通的.我试图在项目属性中寻找类似的东西,但没有好处.我一直在../code_files/Search.c:116: undefined reference to 'reportError'

我在Windows 7下使用Eclipse(Juno)CDT,gcc MinGW

我知道可以包含.a文件,但我找不到任何关于如何包含.o文件 #include "ErrorHandle.h"的说明包含在主c文件中.

任何人都知道如何将.o文件包含到项目中?谢谢!

c eclipse-cdt object-files

3
推荐指数
1
解决办法
6228
查看次数

gcc链接目标文件与警告/优化标志

我们正在使用泛型编译一个软件,其中文件首先被制作成目标文件,它们的构建如下:

arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include  -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flex.o src/flex.c
...
arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include  -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flexdb.o src/flexdb.c
Run Code Online (Sandbox Code Playgroud)

然后他们链接到:

arm-unknown-linux-gnu-gcc -o flex src/flex.o src/flexdb.o src/flexio.o src/flexprotocol.o src/flexsettings.o src/flexstate.o -L/opt/tm-sdk/lib -ltag  -lrt -ltmreader -lsqlite3 -lsha1
Run Code Online (Sandbox Code Playgroud)

我的问题是:我们是否需要在链接期间包含优化和警告标志?如果在从目标文件创建flex二进制文件时包含-Wall,-Wextra和-O2,它会做什么吗?

谢谢

编辑:根据反馈澄清含义.

c gcc gcc-warning compiler-optimization object-files

3
推荐指数
1
解决办法
1159
查看次数

Executable and Linkable Format(.elf) 和 Object(.o) 文件的区别

我在 linux ( man gcc)上查看 gcc 手册中的-c选项 ( gcc -c infile),其中指出:

-c:编译或汇编源文件,但不链接。链接阶段根本没有完成。最终的输出是以每个源文件的目标文件的形式。
默认情况下,源文件的目标文件名是通过将后缀 .c、.i、.s 等替换为 .o 来生成的。

更重要的是,在检查 ELF 文件和目标文件(使用filecomand )时,输出是相同的:

file ./out/main.o: ELF 32-bit LSB relocatable, Atmel AVR 8-bit, version 1 (SYSV), not stripped
file ./out/main.elf: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
Run Code Online (Sandbox Code Playgroud)

所以他们都有相同的描述。我的问题是:

  • 两个文件之间的实际区别是什么,或者如果我有多个源文件?
  • 要运行的正确文件是什么,以及如何生成它?
  • 我需要目标文件,还是它们只是中间文件?
  • 如果我使用-c选项和一些标志(-Wall -g -std=c99 -Os)编译一些源文件并从中获取目标文件,这些标志是否会在 ELF 文件生成中持续存在(如果我在目标文件上使用它们,我可以在生成 ELF 文件时跳过这些标志)?

c elf object-files

3
推荐指数
2
解决办法
2842
查看次数

有没有办法知道在目标文件中导出哪些符号?

嗨,我在Linux环境中工作,我必须链接到已编译的目标文件,它提供了一些服务(services.o),我知道其中一些,但我想知道哪些都是导出的它的符号.

有没有办法实现这个没有来源?如果是这样,怎么样?

非常感谢你.

c symbols export static-libraries object-files

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

如何从目标文件中获取全局变量的初始化值?

如果有目标文件,如何在该目标文件的数据段中获取全局变量的初始化值?例如,说我已经完成以下工作:

# I'm interested in the variable foo inside bar.o in libbar.a:
$ ar -x libbar.a bar.o
$ nm --print-size bar.o | grep foo
00000048 00000004 D foo
Run Code Online (Sandbox Code Playgroud)

这告诉我foo在大小为4的数据段中的偏移量为0x48,但是如何获取加载时获得的实际初始化值呢?

global-variables binutils object-files

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

将.o(C对象文件)链接到Linux上的C++文件/项目

我在linux中的.o文件有问题如下:

我有Visual.cpp调用函数ECL_Drawrect(),这个函数定义为:

#define ECL_Drawrect ECL_bDrawrect
Run Code Online (Sandbox Code Playgroud)

在我的Visual.cpp中,我还包括"ecl.h":

#include "ecl.h"

int main() {
    ECL_Drawrect (0,0,20,20,false);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是函数ECL_bDrawrect在ecl.o文件中,我不知道如何链接它以使用上面提到的函数.

经过一些研究,我想出并设置如下:

g++ Visual.cpp -o Visual /usr/include/ecl.o
Run Code Online (Sandbox Code Playgroud)

ecl.o路径也包含在我的项目中,当我编译时,我收到此错误:

**** Build of configuration Debug for project Visual ****

make all 
Building file: ../src/Visual.cpp
Invoking: GCC C++ Compiler
g++ -m32 -O0 -g3 -Wall -c -fmessage-length=0 /usr/include/ecl.o -MMD -MP -MF"src/Visual.d" -MT"src/Visual.d" -o "src/Visual.o" "../src/Visual.cpp"
g++: /usr/include/ecl.o: linker input file unused because linking not done
Finished building: ../src/Visual.cpp

Building target: Visual
Invoking: GCC C++ Linker
g++ …
Run Code Online (Sandbox Code Playgroud)

c++ linux ubuntu linker object-files

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

#ifndef在链接两个目标文件时是否阻止定义函数两次?

我有两个类实现(.cpp files)

它们都需要一个在header(.h)文件中实现的功能.两个.cpp文件都包含.h文件.编译后,这两个.cpp文件成为两个.o文件.

链接两个目标文件时,是否定义了两次函数?

可以#ifndef防止这种情况吗?

我用过,#ifndef但收到了以下消息:

ld: 1 duplicate symbol for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

c++ linker object-files

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

C是否对目标文件做出任何保证?

我有一些我想要更改的C代码,但我想使用#ifdefs以便可以编译旧的目标文件(后预处理代码不会更改).出于某些原因(编译几个平台和认证原因),我需要保持目标文件相同(除了任何时间戳).

C语言规范或任何C编译器是否对重新编译有任何保证?我一直在做一些谷歌搜索,但我还没有找到关于这个主题的任何内容.

例如:

main.c中

int main() {
    printf("Hello World!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

main.h(新文件)

#ifdef DEBUG
    char some_buffer[1000];
    #define PRINTF(S) (sprintf(some_buffer, S))
#else
    #define PRINTF(S) (printf(S))
#endif
Run Code Online (Sandbox Code Playgroud)

main.c(更新文件)

#include "main.h"

int main() {
    PRINTF("Hello World!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我编译DEBUG更新main.c中没有定义的,现在包括main.h,不C语言规范或任何C编译器作任何保证该目标文件将是相同的?

c macros compilation object-files c-preprocessor

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

C++ 多重定义结构

我的标题util.hpp 包含一个简单的结构:

// util.hpp

struct Point {
  float x;
  float y;
};
Run Code Online (Sandbox Code Playgroud)

两个 cpp 文件,我们称它们为a.cppb.cpp,都包括util.hpp

// a.cpp

#include "util.hpp"

void funcA(float _x, float _y) {
  Point p;
  p.x = _x;
  p.y = _y;
  // ...
}
Run Code Online (Sandbox Code Playgroud)
// b.cpp

#include "util.hpp"

void funcB(float _x, float _y) {
  Point p;
  p.x = _x;
  p.y = _y;
  // ...
}

int main() {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

当我编译a.cppb.cpp独立,然后将它们链接在一起,我没有错误。

这是为什么?由于我包含util.hpp在两个文件中,我们不会有双重定义struct Point …

c++ linker struct header-files object-files

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

符号未显示在目标文件中

由于某种原因,此文件中定义的符号之一未显示在目标文件中:

/**
 * || File: random.cc
 * || Project: Shatter
 * || Encoding: UTF-8
 * || Author: ********
 *
 * Copyright (C) 2016 ********** *. ****
 * All rights reserved.
 * Use by explicit written permission only.
 *
 * Changelog:
 *   - Aug 24, 2016, 07:35:22 PM --- File was created by ********
 *
 */

#include <shatter/random/random.h>

// @TODO: MOVE TO <config-build.h>
#define _M_FEATURE_ARC4RANDOM

#ifdef _M_FEATURE_ARC4RANDOM
    #define RAND_SEED (arc4random())
    #define RAND_IMPL (rand())
#else
    #include <time.h>

    #define RAND_SEED (time(NULL))
    #define RAND_IMPL …
Run Code Online (Sandbox Code Playgroud)

c++ templates object-files

1
推荐指数
1
解决办法
85
查看次数