简体   繁体   English

GCC:带有-O0的奇怪错误,没有

[英]GCC : weird errors with -O0, none without

I'd like to compile my C code without optimisations, but when I add the -O0 option to the compilation command I get lots of "multiple definitions" errors, of functions I didn't even write ! 我想在不进行优化的情况下编译我的C代码,但是当我在编译命令中添加-O0选项时,我遇到了很多“多个定义”错误,甚至没有编写函数! I guess there's something obvious I'm missing here but as a noob I just can't figure out what... 我想这里有些明显的我想念的东西,但是作为菜鸟,我只是不知道是什么...

Here's my code : 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <wiringPi.h>
#include <time.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <unistd.h>
#include <sched.h>
#include <time.h>

#define N       1800

unsigned long int tsec, tnsec;

int main(void)
{
        int err, i;
        printf("started\n");

        struct timespec tps, tpe, req, rem;

        req.tv_nsec = 400000;
        req.tv_sec = 0;

        struct sched_param param;
        param.sched_priority = 99;
        err = sched_setscheduler(getpid(), SCHED_FIFO, &param);
        if (err != 0)
                printf("sched_setscheduler error");
        err = sched_getparam(getpid(), &param);
        if (err != 0)
                printf("sched_getparam error");
        printf("priority = %i\n", param.sched_priority);

        int policy = sched_getscheduler(getpid());
        printf("policy = %i\n", policy);


        sleep(1);

        clock_gettime(CLOCK_REALTIME, &tps);

        #include "noppynop2.c"
        #include "noppynop2.c"
        #include "noppynop2.c"
        #include "noppynop2.c"
        #include "noppynop2.c"
        #include "noppynop2.c"


        clock_gettime(CLOCK_REALTIME, &tpe);
        tnsec = tpe.tv_nsec - tps.tv_nsec;
        tsec = tpe.tv_sec - tps.tv_sec;
        printf("time = %lu sec %lu nsec\n", tsec, tnsec);


        printf("finished\n");

        return 0;
}

To sum thing up, it's a bruteforce attempt to create a delay on a real-time kernel's Linux. 总而言之,这是在实时内核的Linux上造成延迟的蛮力尝试。 "noppynop2.c" contains 500 times asm("nop"). “ noppynop2.c”包含500倍的asm(“ nop”)。 I don't think this is the problem here but that's the context. 我不认为这是这里的问题,但这是上下文。 The code is mostly just a test, and I want to get rid of all optimisations because for the moment the compiler tends to remove an (apparently) unpredictable quantity of "nops", which is the exact opposite of what I'm trying to do... 该代码基本上只是一个测试,我想摆脱所有的优化,因为目前编译器趋向于消除(显然)不可预测的“ nops”数量,这与我正在尝试的完全相反。 ...

When I compile without the -O0 option, everything goes fine : 当我不带-O0选项进行编译时,一切正常:

pi@raspberrypi ~/Desktop/Projects/test_timemeasure_sched $ gcc -Wall -o test_time_measure_sched main.c -lwiringPi -lpthread -lrt
main.c: In function ‘main’:
main.c:22:33: warning: unused variable ‘rem’ [-Wunused-variable]
main.c:22:28: warning: variable ‘req’ set but not used [-Wunused-but-set-variable]
main.c:19:11: warning: unused variable ‘i’ [-Wunused-variable]

But when I add the -O0 here's what I get : 但是,当我添加-O0时,我得到的是:

pi@raspberrypi ~/Desktop/Projects/test_timemeasure_sched $ gcc -Wall -o -O0 test_time_measure_sched main.c -lwiringPi -lpthread -lrt
main.c: In function ‘main’:
main.c:22:33: warning: unused variable ‘rem’ [-Wunused-variable]
main.c:22:28: warning: variable ‘req’ set but not used [-Wunused-but-set-variable]
main.c:19:11: warning: unused variable ‘i’ [-Wunused-variable]
test_time_measure_sched: In function `_fini':
:(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../arm-linux-gnueabihf/crti.o:(.fini+0x0): first defined here
test_time_measure_sched: In function `__data_start':
:(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../arm-linux-gnueabihf/crt1.o:(.data+0x0): first defined here
test_time_measure_sched: In function `__data_start':
:(.data+0x4): multiple definition of `__dso_handle'
/usr/lib/gcc/arm-linux-gnueabihf/4.6/crtbegin.o:(.data+0x0): first defined here
test_time_measure_sched:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../arm-linux-gnueabihf/crt1.o:(.rodata.cst4+0x0): first defined here
test_time_measure_sched: In function `_start':
:(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../arm-linux-gnueabihf/crt1.o:(.text+0x0): first defined here
test_time_measure_sched: In function `_init':
:(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../arm-linux-gnueabihf/crti.o:(.init+0x0): first defined here
/tmp/cc5At86c.o: In function `main':
main.c:(.text+0x0): multiple definition of `main'
test_time_measure_sched::(.text+0xac): first defined here
collect2: ld returned 1 exit status

What could I do to get rid of those errors ? 我该怎么做才能消除这些错误?

Thanx in advance for your help. 提前感谢您的帮助。

Best regards. 最好的祝福。

Eric 埃里克

The gcc command should be gcc命令应为

gcc -Wall -O0 -o test_time_measure_sched main.c -lwiringPi -lpthread -lrt

instead of 代替

gcc -Wall -o -O0 test_time_measure_sched main.c -lwiringPi -lpthread -lrt

With the second command the old binary test_time_measure_sched is treated as an input file by gcc. 使用第二个命令,旧的二进制test_time_measure_sched被gcc视为输入文件。 The additional errors you are getting are all linker errors, which indicates that gcc tries to link the old binary to your new code. 您遇到的其他错误都是链接器错误,这表明gcc试图将旧的二进制文件链接到您的新代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM