我正在从学校开展一个项目,我们得到了一个.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文件包含到项目中?谢谢!
我们正在使用泛型编译一个软件,其中文件首先被制作成目标文件,它们的构建如下:
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,它会做什么吗?
谢谢
编辑:根据反馈澄清含义.
我在 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 文件时跳过这些标志)?嗨,我在Linux环境中工作,我必须链接到已编译的目标文件,它提供了一些服务(services.o),我知道其中一些,但我想知道哪些都是导出的它的符号.
有没有办法实现这个没有来源?如果是这样,怎么样?
非常感谢你.
如果有目标文件,如何在该目标文件的数据段中获取全局变量的初始化值?例如,说我已经完成以下工作:
# 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,但是如何获取加载时获得的实际初始化值呢?
我在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) 我有两个类实现(.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代码,但我想使用#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编译器作任何保证该目标文件将是相同的?
我的标题util.hpp 包含一个简单的结构:
// util.hpp
struct Point {
float x;
float y;
};
Run Code Online (Sandbox Code Playgroud)
两个 cpp 文件,我们称它们为a.cpp和b.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.cpp和b.cpp独立,然后将它们链接在一起,我没有错误。
这是为什么?由于我包含util.hpp在两个文件中,我们不会有双重定义struct Point …
由于某种原因,此文件中定义的符号之一未显示在目标文件中:
/**
* || 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) object-files ×10
c ×5
c++ ×4
linker ×3
binutils ×1
compilation ×1
eclipse-cdt ×1
elf ×1
export ×1
gcc ×1
gcc-warning ×1
header-files ×1
linux ×1
macros ×1
struct ×1
symbols ×1
templates ×1
ubuntu ×1