0

Makefilesプラットフォームを次のようなステートメントで条件付きにしようとしています。

ifeq ($(UNAME), Linux)
# LINUX version
program_NAME := lib$(TARGET).so
OBJDIR = ../build/linux
endif

ifeq ($(UNAME), MINGW32_NT-6.1)
# WINDOWS version
program_NAME := lib$(TARGET).dll
OBJDIR = ../build/windows
endif

と:

ifeq ($(UNAME), Linux)
# LINUX version
program_INCLUDE_DIRS := \
    /home/ben/projects/g2/src \
    /home/ben/projects/pulse_IO/src \
    /home/ben/projects/core/src

endif

ifeq ($(UNAME), MINGW32_NT-6.1)

# WINDOWS Virtual Machine version
program_INCLUDE_DIRS := \
    E:/g2/src \
    E:/pulse_IO/src \
    E:/core/src

endif

次に、LinuxまたはLinuxホストOS上でVMとして(virtualbox経由で)実行されているWindows7のいずれかでsrcをコンパイルします。私が解決できなかった問題は、オブジェクトファイルとその結果の共有ライブラリまたは実行可能ファイルをプラットフォーム固有のディレクトリ(ソースコードがある場所など)に書き込む方法/build/linuxです/build/windows/src

ご覧のとおり、変数を追加しましたが、それを使用して、プラットフォームを条件としてファイルを正しいディレクトリOBJDIRにリダイレクトする方法がわかりません。.o, .so, .dll, .exe簡単なはずですが、私の研究は、私が求めているvpathものではないと思う使用法に関する記事で行き詰まり続けています。

Makefileの変更が必要だと思う部分は次のとおりです。

LINK.c := $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

$(program_NAME): $(program_OBJS)
    $(LINK.c) -shared -Wl,-soname,$(program_NAME) $(program_OBJS) -o $(program_NAME)

私はおそらくautotoolsやcmakeのようなもっと賢いものを使うべきですが、今のところこれを機能させるだけで素晴らしいでしょう。

また、追加する必要があります。オブジェクトファイルのリストは次のように作成されます。

program_C_OBJS := ${program_C_SRCS:.c=.o}

試しました:

program_OBJS := $(addprefix $(OBJDIR)/$program_C_OBJS)

しかし、addprefixが間違ったnoを持っているコンパンを作ってください。引数の

4

2 に答える 2

1

どのコンパイラとツールセットを使用していますか?QNXの場合、次のようなマクロがあります。

$OS
$CPU
$PRODUCT
$PROJECT
$SECTION
$VARIANT ($VARIANTLIST, $EXCLUDE_VARIANTLIST)

これらを使用すると、ビルドの結果に合わせてターゲットフォルダーとファイル名をカスタマイズできます。

http://www.qnx.com/developers/docs/6.3.2/neutrino/prog/make_convent.html

他のコンパイラ/ツールチェーンにも同様の機能があります。

于 2012-05-15T14:57:28.980 に答える
1

gmakeについては、ここを参照してください:

 OBJDIR := objdir
 OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

 $(OBJDIR)/%.o : %.c
         $(COMPILE.c) $(OUTPUT_OPTION) $<

 all: $(OBJS)

 $(OBJS): | $(OBJDIR)

 $(OBJDIR):
         mkdir $(OBJDIR)
于 2012-05-15T15:03:00.443 に答える