簡體   English   中英

GCC:帶有-O0的奇怪錯誤,沒有

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

我想在不進行優化的情況下編譯我的C代碼,但是當我在編譯命令中添加-O0選項時,我遇到了很多“多個定義”錯誤,甚至沒有編寫函數! 我想這里有些明顯的我想念的東西,但是作為菜鳥,我只是不知道是什么...

這是我的代碼:

#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;
}

總而言之,這是在實時內核的Linux上造成延遲的蠻力嘗試。 “ noppynop2.c”包含500倍的asm(“ nop”)。 我不認為這是這里的問題,但這是上下文。 該代碼基本上只是一個測試,我想擺脫所有的優化,因為目前編譯器趨向於消除(顯然)不可預測的“ nops”數量,這與我正在嘗試的完全相反。 ...

當我不帶-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]

但是,當我添加-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

我該怎么做才能消除這些錯誤?

提前感謝您的幫助。

最好的祝福。

埃里克

gcc命令應為

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

代替

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

使用第二個命令,舊的二進制test_time_measure_sched被gcc視為輸入文件。 您遇到的其他錯誤都是鏈接器錯誤,這表明gcc試圖將舊的二進制文件鏈接到您的新代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM