如何在 c c++ 混合生成文件中为 c 对象添加附加规则?

Posted

技术标签:

【中文标题】如何在 c c++ 混合生成文件中为 c 对象添加附加规则?【英文标题】:How to add an additional rule for c objects in a c c++ mixed makefile? 【发布时间】:2017-07-18 20:39:07 【问题描述】:

我在 Windows 机器上将一些 c 代码添加到 c++ 代码库中;它在 Windows Visual Studio 上运行良好;但我很难让它在 linux 上运行。

下面的文件是一个使用makefile 运行的subdir.mk。 我正在编辑这个在 linux64 系统上为纯 c++ 编写的文件,以添加我的 c 更改。我添加了 cc 来源,如下所示。我是新来的。我听说如果你有标志 make 知道如何构建,但现有文件有这个规则 %.o: ../%.cpp ,没有它它就无法工作。我尝试以不同的方式添加 %.o: ../%.c (使用 a ,然后通过管道),但没有成功。

你看到我在这里做错了吗?欢迎任何反馈。谢谢!

CC=gcc
CXX=g++

CXXFLAGS=-Wall -g
CCFLAGS=-g

# Add inputs and outputs from these tool invocations to the build variables
CPP_SRCS += \
../x.cpp \
../y.cpp \
../main.cpp

CC_SRCS += \
../z__c.c

OBJS += \
./x.o \
./y.o \
./z__c.o \
./main.o

CPP_DEPS += \
./x.d \
./y.d \
./main.d

icpc='/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/bin/g++'
CC='/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/bin/gcc'
# Each subdirectory must supply rules for building sources it contributes
%.o: ../%.cpp
#%.o: ../%.c


    @echo 'Building file: $<'
    @echo 'Invoking: G++ Compiler'
    g++ -Wall -mavx -g -O -O1 -std=c++11 -L/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/lib64 -libstdc -libsupc++ -libtsan -libubsan -libvtv -libquadmath -libgcc_s -libgcj  -L/opt/intel/composer_xe_2013.5.192/mkl/lib/intel64 -lmkl_mc -lmkl_sequential -lmkl_gf_ilp64 -lmkl_avx -lmkl_lapack95_lp64 -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -L/home../oed -liboed -liboedlib -I/opt/intel/composer_xe_2013.5.192/mkl/include  
    -I/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/include -I/home..include -I/home../debug  -DDEBUG -DMKL_ILP64
    -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -c -o "$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '

【问题讨论】:

会不会是./x.d后面的空行? 你在哪里学习如何编写 makefile? 我正在阅读 GNU make 手册——这并不容易理解,但这不是我最初写的。它似乎是由 eclipse 生成的,我只是在编辑以使代码的更改在这个环境(linux)上工作。 我注意到../%.cpp。我认为这有点复杂。您可能想阅读How to place object files in separate subdirectory 实际上 GNU make 手册是技术写作的最佳示例之一 - 您的问题是尝试使用 eclipse 进行 C++ 编程,或者其他任何东西。 【参考方案1】:

你不想要这样的东西吗?

CC=gcc
CXX=g++

CXXFLAGS=-Wall -g
CCFLAGS=-g

# Add inputs and outputs from these tool invocations to the build variables
CPP_SRCS += \
../x.cpp \
../y.cpp \
../main.cpp

CC_SRCS += \
../z__c.c

OBJS += \
./x.o \
./y.o \
./z__c.o \
./main.o

CPP_DEPS += \
./x.d \
./y.d \
./main.d

icpc='/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/bin/g++'
CC='/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/bin/gcc'
# Each subdirectory must supply rules for building sources it contributes
%.o: ../%.cpp
    @echo 'Building file: $<'
    @echo 'Invoking: G++ Compiler'
    g++ -Wall -mavx -g -O -O1 -std=c++11 -L/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/lib64 -libstdc -libsupc++ -libtsan -libubsan -libvtv -libquadmath -libgcc_s -libgcj  -L/opt/intel/composer_xe_2013.5.192/mkl/lib/intel64 -lmkl_mc -lmkl_sequential -lmkl_gf_ilp64 -lmkl_avx -lmkl_lapack95_lp64 -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -L/home../oed -liboed -liboedlib -I/opt/intel/composer_xe_2013.5.192/mkl/include  
    -I/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/include -I/home..include -I/home../debug  -DDEBUG -DMKL_ILP64
    -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -c -o "$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '

%.o: ../%.c
    @echo 'Building file: $<'
    @echo 'Invoking: GCC Compiler'
    gcc -Wall -mavx -g -O -O1 -L/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/lib64 -libstdc -libsupc++ -libtsan -libubsan -libvtv -libquadmath -libgcc_s -libgcj  -L/opt/intel/composer_xe_2013.5.192/mkl/lib/intel64 -lmkl_mc -lmkl_sequential -lmkl_gf_ilp64 -lmkl_avx -lmkl_lapack95_lp64 -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -L/home../oed -liboed -liboedlib -I/opt/intel/composer_xe_2013.5.192/mkl/include  
    -I/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/include -I/home..include -I/home../debug  -DDEBUG -DMKL_ILP64
    -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -c -o "$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '

【讨论】:

subdir.mk:59: warning: overriding recipe for target '@echo' subdir.mk:53: warning: ignoring old recipe for target '@echo' subdir.mk:59: warning: overriding recipe for target ''Building' subdir.mk:53: warning: ignoring old recipe for target ''Building' subdir.mk:59: warning: overriding recipe for target 'file' subdir.mk:53: warning: ignoring old recipe for target 'file' make: *** No rule to make target ''', needed by '@echo'. Stop. @MadHatter 我刚刚重新格式化并将其保存为 makefile(删除前导空格并插入制表符,它与 make GNU Make 4.2.1 Built for i686-pc-cygwin Copyright (C) 1988-2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt; This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 一起使用 制作格式真的很棘手;花了很多时间在这上面;希望我以前知道。多亏了你,终于让它工作了。 @cleblanc

以上是关于如何在 c c++ 混合生成文件中为 c 对象添加附加规则?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写混合 C 和 C++ 的 makefile

在 Visual Studio 2010 C++ 中为 /// 生成 XML 文档注释

C/C++还能混合编程?这让我事半功倍

在混合 C 和 C++ 代码编程中捕获异常后对象不会被破坏

如何正确混合 C++ 和 C

在 CMake 中混合 C 和 C++,啥 CMakeCCompilerId.c 以及如何丢弃它