如何在 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 <http://gnu.org/licenses/gpl.html> 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 对象添加附加规则?的主要内容,如果未能解决你的问题,请参考以下文章