gcc 컴파일 오류

Post Reply
mandooawr
Posts: 32
Joined: Tue Dec 08, 2020 5:29 pm
languages_spoken: english
ODROIDs: N2+
Has thanked: 0
Been thanked: 0
Contact:

gcc 컴파일 오류

Post by mandooawr »

1. One Wire 센서 테스트를 위해
소스구글에서 공수한 소스를 컴파일 하니 오류가 나는 군요..
------ 소스 ----
//센서값을 읽어 올 수 있는 /sys/bus/w1/devices/28-0000061796ff/w1_slave 위치들을 찾아서 화면에 출력해주는 C언어 소스코드입니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
#include <errno.h>

#define PROBEPATH "/sys/bus/w1/devices" // Location of the probes
#define MAXPROBES 5 // Max number of probes
#define PROBENAMELEN 80 // Max length of the probenames including directory.
#define BUFSIZE 256 // Typical charbuffer

char probepath[MAXPROBES][PROBENAMELEN];
char probename[MAXPROBES][PROBENAMELEN];
char alias[MAXPROBES][BUFSIZE];
FILE *probefd;
int numOfSensor;


///sys/bus/w1/devices 아래에 위치하는 센서의 ID값을 찾기 위한 함수
int findprobes(void)
{
struct dirent *pDirent;
DIR *pDir;
int count;

count = 0;

pDir = opendir(PROBEPATH);
if (pDir == NULL) {
printf("Cannot open directory '%s'\n", PROBEPATH);
return 0;
}

while ((pDirent = readdir(pDir)) != NULL)
{
//모든 DS18B20의 아이디는 28-로 시작한다.
if (pDirent->d_name[0] == '2' && pDirent->d_name[1] == '8' && pDirent->d_name[2] == '-')
{
snprintf(probepath[count], PROBENAMELEN-1, "%s/%s/w1_slave", PROBEPATH, pDirent->d_name);
snprintf(probename[count], PROBENAMELEN-1, "%s", pDirent->d_name);

printf ("Found DS18B20 compatible probe named '%s':\nDevice file '%s'\n",
probename[count], probepath[count]);
count++;
}
}

closedir(pDir);

return count;
}


int main()
{
int i;
double temperature;
char *temp;
time_t now;
struct tm *t;
char buf[BUFSIZE];

numOfSensor = findprobes(); //몇개의 센서가 연결되어 있는지 확인하고 그 위치를 저장한다.
if (numOfSensor == 0)
{
printf("Error: No DS18B20 compatible probes located.\n");
exit(-1);
}

while(1)
{
for (i = 0; i < numOfSensor; i++) //발견된 센서수 만큼 반복한다.
{
probefd = fopen(probepath, "r"); //probepath에 저장된 위치로부터 센서값을 읽어올 수 있다.

if (probefd == NULL)
{
printf( "Error: Unable to open '%s': %s\n",
probepath, strerror(errno));
exit(-1);
}

fgets(buf, sizeof(buf)-1, probefd); // 첫번째 줄은 무시 함
memset(buf, 0, sizeof(buf));

fgets(buf, sizeof(buf)-1, probefd); //두번째 줄을 불러와서
temp = strtok(buf, "t="); //"t="뒤에 오는 온도값을 파싱 한다.
temp = strtok(NULL, "t=");
temperature = atof(temp)/1000; //1000으로 나누어야 원하 는 온도값이 됨

now = time(NULL); //현재 날짜 및 시간을 출력하기 위한 준비
t = localtime(&now);

printf("%s", probename);
printf("\t%04d-%02d-%02d\t%02d:%02d:%02d\t",
t->tm_year + 1900, t->tm_mon+1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec );
printf("%2.3f\n",temperature);

fclose(probefd);
}
}

return 0;
}
------ 컴파일 옵션 ----
gcc w1_slave_check.c -o temp -lwiringPi -lwiringPiDev -lm -lpthread -lrt -lcrypt -g -ggdb
------ 오류 ----
w1_slave_check.c: In function ‘findprobes’:
w1_slave_check.c:42:72: warning: ‘%s’ directive output may be truncated writing up to 255 bytes into a region of size 59 [-Wformat-truncation=]
42 | snprintf(probepath[count], PROBENAMELEN-1, "%s/%s/w1_slave", PROBEPATH, pDirent->d_name);
| ^~
w1_slave_check.c:42:25: note: ‘snprintf’ output between 30 and 285 bytes into a destination of size 79
42 | snprintf(probepath[count], PROBENAMELEN-1, "%s/%s/w1_slave", PROBEPATH, pDirent->d_name);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
w1_slave_check.c:43:69: warning: ‘%s’ directive output may be truncated writing up to 255 bytes into a region of size 79 [-Wformat-truncation=]
43 | snprintf(probename[count], PROBENAMELEN-1, "%s", pDirent->d_name);
| ^~
w1_slave_check.c:43:25: note: ‘snprintf’ output between 1 and 256 bytes into a destination of size 79
43 | snprintf(probename[count], PROBENAMELEN-1, "%s", pDirent->d_name);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

------

gcc -v

--- Odroid N2+

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=aarch64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=aarch64-linux-gnu --host=aarch64-linux-gnu --target=aarch64-linux-gnu
Thread model: posix
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)

--- 라즈베리파이 3B
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/5/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --disable-werror --enable-multilib --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.12)
-----------
라즈베리파이에서는 같은 컴파일 옵션에서 이상없이 잘됩니다.

User avatar
tobetter
Posts: 7171
Joined: Mon Feb 25, 2013 10:55 am
languages_spoken: Korean, English
ODROIDs: Many
Location: Paju, South Korea
Has thanked: 384 times
Been thanked: 1052 times
Contact:

Re: gcc 컴파일 오류

Post by tobetter »

위의 소스 컴파일에서 나오는 로그는 error가 아니고 컴파일 warning입니다. 아마도 실행파일은 정상적으로 생성이 되었을겁니다. gcc버전을 보시면 아시겠지만, 버전 차이가 많이 나고 gcc-9의 문법검사가 더 엄격합니다. 소스코드를 봤는데 정리가 필요해 보여서 gcc-9으로 컴파일 해봤고 아래의 수정 내용 검토해보시기 바랍니다. 동작 확인은 안했습니다.

Code: Select all

--- x.c	2021-01-08 12:45:39.299162648 +0900
+++ y.c	2021-01-08 12:49:22.019915329 +0900
@@ -11,8 +11,8 @@
 #define PROBENAMELEN 80 // Max length of the probenames including directory.
 #define BUFSIZE 256 // Typical charbuffer
 
-char probepath[MAXPROBES][PROBENAMELEN];
-char probename[MAXPROBES][PROBENAMELEN];
+char probepath[MAXPROBES][PATH_MAX];
+char probename[MAXPROBES][PATH_MAX];
 char alias[MAXPROBES][BUFSIZE];
 FILE *probefd;
 int numOfSensor;
@@ -38,8 +38,8 @@
 		//모든 DS18B20의 아이디는 28-로 시작한다.
 		if (pDirent->d_name[0] == '2' && pDirent->d_name[1] == '8' && pDirent->d_name[2] == '-')
 		{
-			snprintf(probepath[count], PROBENAMELEN-1, "%s/%s/w1_slave", PROBEPATH, pDirent->d_name);
-			snprintf(probename[count], PROBENAMELEN-1, "%s", pDirent->d_name);
+			snprintf(probepath[count], sizeof(probepath[count]), "%s/%s/w1_slave", PROBEPATH, pDirent->d_name);
+			snprintf(probename[count], sizeof(probepath[count]), "%s", pDirent->d_name);
 
 			printf ("Found DS18B20 compatible probe named '%s':\nDevice file '%s'\n",
 					probename[count], probepath[count]);
@@ -73,12 +73,12 @@
 	{
 		for (i = 0; i < numOfSensor; i++) //발견된 센서수 만큼 반복한다.
 		{
-			probefd = fopen(probepath, "r"); //probepath에 저장된 위치로부터 센서값을 읽어올 수 있다.
+			probefd = fopen(probepath[i], "r"); //probepath에 저장된 위치로부터 센서값을 읽어올 수 있다.
 
 			if (probefd == NULL)
 			{
 				printf( "Error: Unable to open '%s': %s\n",
-						probepath, strerror(errno));
+						probepath[i], strerror(errno));
 				exit(-1);
 			}
 
@@ -93,7 +93,7 @@
 			now = time(NULL); //현재 날짜 및 시간을 출력하기 위한 준비
 			t = localtime(&now);
 
-			printf("%s", probename);
+			printf("%s", probename[i]);
 			printf("\t%04d-%02d-%02d\t%02d:%02d:%02d\t",
 					t->tm_year + 1900, t->tm_mon+1, t->tm_mday,
 					t->tm_hour, t->tm_min, t->tm_sec );

mandooawr
Posts: 32
Joined: Tue Dec 08, 2020 5:29 pm
languages_spoken: english
ODROIDs: N2+
Has thanked: 0
Been thanked: 0
Contact:

Re: gcc 컴파일 오류

Post by mandooawr »

네.. 감사합니다.
확인해 보겠습니다.

mandooawr
Posts: 32
Joined: Tue Dec 08, 2020 5:29 pm
languages_spoken: english
ODROIDs: N2+
Has thanked: 0
Been thanked: 0
Contact:

Re: gcc 컴파일 오류

Post by mandooawr »

혹시 컴파일 한다고 WIFi가 끊어 질수 도 있나요?
점심 전에 컴파일시 오류나서 문의 드리고 점심 먹고 나서 확인하려하니 WiFi가 끊어져있네요...
Odroid가 사무실에 있지 않고 현장에 있어서 현장가서 다운되었나 확인하니 Odroid는 정상인데 시스템 오류가 발생했다는 짧막한 메시지가 뜨네요..
일단 확인하고 GUI 환경설정의 WiFi 설정만 들어갔다가 나오니 다시 연결이 되네요..
GUI 시스템 오류 메시지는 어디서 보는 지 찾아보고 로그 남아 있으면 공유하겠습니다.

Post Reply

Return to “N2/N2+”

Who is online

Users browsing this forum: No registered users and 2 guests