Day After Day
tsurezure naru mamani...
ANOTHER DECADE

from 2022 when it's begining after/with CORONA Virus.

Clang を使ってマルチプラットフォーム化する

2月
10
2023
Back
Alt+HOME


Clang(たぶんC言語という意味)はWindows向け、Linux向けなどマルチプラットフォームなので環境を共通化できそうです。

後で分かったことですが[klæŋ]と発音するようですが、私は[síːlæŋ]の方が良いと思います。


この画像をクリックすると、ダウンロードサイトへ遷移します。次項のからの説明はそのページでのダウンロードから始まっています。

GCC (GCC.exe) の代わりに Clang を使ってマルチプラットフォーム化する


  1. Clang(たぶんC言語という意味)はWindows向け、Linux向けなどマルチプラットフォームなので環境を共通化できそうです。
  2. 後で分かったことですが[klæŋ]と発音するようですが、 私は[síːlæŋ]の方が良いと思います。

  3. ▼Assets をクリックして一覧を表示します。

  4. リストの中から LLVM-16.0.0-rc2-win64.exe をクリックしてダウンロードし、ダブルクリックしてインストールします。

  5. make の時と同様に PATH を登録します。

  6. C:\Program Files\LLVM\bin

    これで今まで Linux GCC で使用していた Makefile がほぼそのまま使えるようになりました。
    ###################################################
    # Makefile for compiling TLMForwarder.c
    #                      Created by Yosh Todo/JE3HCZ
    ###################################################
    
    # Program Name and object files
    PROGRAM	=	TLMForwarder.exe
    OBJECTS	=	TLMForwarder.o GetConfig.o GetSatList.o SendReport.o TLMF.o
    CFLAG	=	-lws2_32
    
    # Redefine MACRO
    CC		=	clang
    RM		=	del
    
    # Define extention of Suffix Rules
    .SUFFIXES	: .c .object
    
    # Rule of compiling program
    $(PROGRAM)	:	$(OBJECTS)
    	$(CC) $(CFLAG) -o $(PROGRAM) $^
    
    # Suffix Rule
    .c.object	:
    	$(CC) -c $<
    
    # Target of Delet files
    .PHONY	:	clean
    clean	:
    	$(RM) $(PROGRAM) $(OBJECTS)
    
    # Dependency of Header Files
    $(OBJECTS)	:	TLMF.h
    	

    Linux GCCの時と明らかに違っているのは プログラムの拡張子 exe を付けたことと CFLAG = -lws2_32 の部分です。これは VS Code でも必要でした。


Clangを使うときの注意点


  1. 安全のために fopen_s や localtime_s など _s の付いた関数を使うよう指示されます。

  2. // GCC の記述
    time_t	timer;
    struct	tm	*timeptr;							// ポインタとして指定
    char	tmstr[32];
    
    timer = time(NULL);
    gmtime(timeptr, &timer);							// ポインタに代入
    strftime(tmstr, 32, "%Y-%m-%d %H:%M:%S", timeptr);
    
    // Clang 推奨の記述 gmtime_s, localtime_s を使うための違い
    time_t	timer;
    struct	tm	timenow;							// ポインタではなく
    char	tmstr[32];
    errno_t	error;
    
    timer = time(NULL);
    error = localtime_s(&timenow, &timer);						// アドレスとして代入
    strftime(tmstr, 32, "%Y-%m-%d %H:%M:%S", &timenow);
    


Back
Alt+HOME