[C++] 361 BBS閲覧アプリの製作 その34 FLTK内部ソースコード混在によるビルドエラー 原因判明 #define命令

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0, FLTK 1.3.9]

前回記事のビルドエラーについて原因が判明しました。

Fl_WebView.cppで定義していたプリプロセッサの#define命令が悪さをしていました。

#define命令 FL_INTERNALSによりmac.Hのif文で誤った分岐に誘導されていました。なぜ急にプリプロセッサが機能し始めたのか、については不明です。

とりあえずプリプロセッサは無効にしました。libfltk_webview.aファイルに静的ライブラリ化しなくても、これまで通りビルドできます。

// #define FL_INTERNALS // mac.Hのif文で誤った分岐に誘導していたため無効化

#include "Fl_WebView.H"
#include "webview.h"
#include <FL/Fl.H>
#include <FL/platform.H>
#include <stdexcept>

extern "C" void my_close_win(void *win);
extern "C" void make_delegate(void *child, void *parent);

void close_cb(Fl_Widget *w, void *win) {
  my_close_win(win);
  w->hide();
}

void Fl_WebView::navigate(const char *addr) { webview_navigate(wv, addr); }

Fl_WebView::Fl_WebView(int x, int y, int w, int h, const char *title)
    : Fl_Double_Window(x, y, w, h, title) {
  Fl_Double_Window::end();
}

void Fl_WebView::draw() {
  if (wv)
    webview_set_size(wv, w(), h(), 0);
}

void Fl_WebView::init() {
    if (!shown())
        throw std::runtime_error("The window needs to be shown.");
    
    auto handle = fl_xid(this);
    wv = webview_create(false, (void *)handle);
    make_delegate((void *)webview_get_window(wv), (void *)handle);
    // Fl::add_idle(webview_run, wv); // この行をコメントアウトする
    this->top_window()->callback(close_cb, (void *)webview_get_window(wv));
}
#if !(defined(FL_LIBRARY) || defined(FL_INTERNALS)) // this part is used when compiling an application program
#  include <FL/Fl_Widget.H>

typedef struct flCocoaRegion* Fl_Region;
typedef struct CGContext* CGContextRef;
typedef struct OpaquePMPrintSettings*   PMPrintSettings;
typedef struct OpaquePMPageFormat*      PMPageFormat;
typedef struct OpaquePMPrintSession*    PMPrintSession;
typedef struct CGImage* CGImageRef;
typedef struct __CFData* CFMutableDataRef; // used in Fl_Copy_Surface.H
typedef CGContextRef Fl_Offscreen;

#else // this part must be compiled when building the FLTK libraries

※ mac.Hのif文でelseの方に誘導されていた