繁体   English   中英

Make: 如何用 hpp 和 cpp 文件混合项目编写 makefile

[英]Make: How to write makefile with both hpp and cpp file mixture project

我正在尝试为我的项目制作 makefile,该项目由 Main.cpp 文件构成,其中包含一些 *.hpp/h 文件(称为 L.hpp、Dh、UC.hpp)。 header 文件(主要是 hpp)包含实现和声明。 此外,Main.cpp 和 L.hpp 使用了 class object C。 下面是它的关系图。

文件之间的关系

之后我继续为它写一个 makefile (如下)。 公共变量,例如 CXX 被省略(因为它是在环境脚本中编写的,我只是在运行 makefile 之前获取文件)。 附加变量 ($(MISC), $(ADD_INC), $(LIB_LOC) $(LDLIBS)) 是 main.cpp 和 L.hpp 所需的各种包含、库、编译设置

###
### Library file 
###
LDLIBS  =  -lxml2  -ldl -lgstpbutils-1.0 -lgstsdp-1.0  -lgstapp-1.0 -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0  -lpthread -lstdc++ -lnsl -lm
LIB_PKG    = -L${SDKTARGETSYSROOT}/usr/lib/pkgconfig
LIB_GST    = -L${SDKTARGETSYSROOT}/usr/lib/gstreamer
LIB_PRJ    = -L${SDKTARGETSYSROOT}/usr/lib

LIB_LOC    = $(LIB_PKG) $(LIB_GST) $(LIB_PRJ)

###
### Header file dependency list
###
# include for gstreamer
INC_GST      = -I$(SDKTARGETSYSROOT)/usr/include/gstreamer-1.0/

# include for glib
INC_GLIB         = -I$(SDKTARGETSYSROOT)/usr/include/glib-2.0
INC_GLIB_CONFIG  = -I$(SDKTARGETSYSROOT)/usr/lib/glib-2.0/include
      
ADD_INC          = $(INC_GST) $(INC_GLIB) $(INC_GLIB_CONFIG) 

MISC             = -std=c++11 -c -fpermissive -fmessage-length=0 $(shell pkg-config --cflags)


# partial makefile
#
# Define the Target name and main object list
#
FINAL_TARGET = VS2
OBJ          = ../Main.cpp C.o    

# 
# Build Rules
#
all: $(FINAL_TARGET)

C.o: ../C.cpp ../C.h
    $(CXX) $(CXXFLAGS) $(MISC) -c $< -o $@ $(LDFLAGS) $(LIB_LOC) $(LDLIBS)


$(FINAL_TARGET): $(OBJ) 
    $(CXX) $(CXXFLAGS) $(ADD_INC) $(MISC) -o $(FINAL_TARGET) $(OBJ)  $(LDFLAGS) $(LIB_LOC) $(LDLIBS)

clean:
    rm -rf  $(FINAL_TARGET) *.o

编译,除了得到C.o: linker input file unused because linking not done作为警告完成,没有任何其他问题。 但是,VS2的最终产品在移植到环境中运行时似乎并不能正常运行。 我用过file VS2 ,发现VS2其实是一个可重定位的文件(好像链接没做)

所以我有以下问题:

  • 我是否正确编写了 makefile? 仅编译 main.cpp 和 C.cpp

  • 我应该如何包含 hpp 文件? 已阅读Write makefile for.cpp 和.hpp c++ 不能说我完全理解作者,但它似乎要求加入线条

    罗:../L.hpp OBJ =../Main.cpp C.o 罗

需要你的建议

==================================================== =================

编辑更多信息

基本上我只是在使用上面的 makefile 之前获取下面的文件

# Check for LD_LIBRARY_PATH being set, which can break SDK and generally is a bad practice
# http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN80
# http://xahlee.info/UnixResource_dir/_/ldpath.html
# Only disable this check if you are absolutely know what you are doing!
if [ ! -z "$LD_LIBRARY_PATH" ]; then
    echo "Your environment is misconfigured, you probably need to 'unset LD_LIBRARY_PATH'"
    echo "but please check why this was set in the first place and that it's safe to unset."
    echo "The SDK will not operate correctly in most cases when LD_LIBRARY_PATH is set."
    echo "For more references see:"
    echo "  http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN80"
    echo "  http://xahlee.info/UnixResource_dir/_/ldpath.html"
    return 1
fi

export SDKTARGETSYSROOT=/opt/wayland/sysroots/cortexa53-crypto-poky-linux
export PATH=/opt/wayland/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/wayland/sysroots/x86_64-pokysdk-linux/usr/sbin:/opt/wayland/sysroots/x86_64-pokysdk-linux/bin:/opt/wayland/sysroots/x86_64-pokysdk-linux/sbin:/opt/wayland/sysroots/x86_64-pokysdk-linux/usr/bin/../x86_64-pokysdk-linux/bin:/opt/wayland/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux:/opt/wayland/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux-musl:$PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig:$SDKTARGETSYSROOT/usr/share/pkgconfig
export CONFIG_SITE=/opt/wayland/site-config-cortexa53-crypto-poky-linux
export OECORE_NATIVE_SYSROOT="/opt/wayland/sysroots/x86_64-pokysdk-linux"
export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"
export OECORE_ACLOCAL_OPTS="-I /opt/wayland/sysroots/x86_64-pokysdk-linux/usr/share/aclocal"
export OECORE_BASELIB="lib"
export OECORE_TARGET_ARCH="aarch64"
export OECORE_TARGET_OS="linux"
unset command_not_found_handle
export CC="aarch64-poky-linux-gcc  -mcpu=cortex-a53 -march=armv8-a+crc+crypto -fstack-protector-strong  -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=$SDKTARGETSYSROOT"
export CXX="aarch64-poky-linux-g++  -mcpu=cortex-a53 -march=armv8-a+crc+crypto -fstack-protector-strong  -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=$SDKTARGETSYSROOT"
export CPP="aarch64-poky-linux-gcc -E  -mcpu=cortex-a53 -march=armv8-a+crc+crypto -fstack-protector-strong  -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=$SDKTARGETSYSROOT"
export AS="aarch64-poky-linux-as "
export LD="aarch64-poky-linux-ld  --sysroot=$SDKTARGETSYSROOT"
export GDB=aarch64-poky-linux-gdb
export STRIP=aarch64-poky-linux-strip
export RANLIB=aarch64-poky-linux-ranlib
export OBJCOPY=aarch64-poky-linux-objcopy
export OBJDUMP=aarch64-poky-linux-objdump
export READELF=aarch64-poky-linux-readelf
export AR=aarch64-poky-linux-ar
export NM=aarch64-poky-linux-nm
export M4=m4
export TARGET_PREFIX=aarch64-poky-linux-
export CONFIGURE_FLAGS="--target=aarch64-poky-linux --host=aarch64-poky-linux --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types "
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types "
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="3.3.0"
export OECORE_SDK_VERSION="3.3.0"
export ARCH=arm64
export CROSS_COMPILE=aarch64-poky-linux-

# Append environment subscripts
if [ -d "$OECORE_TARGET_SYSROOT/environment-setup.d" ]; then
    for envfile in $OECORE_TARGET_SYSROOT/environment-setup.d/*.sh; do
        . $envfile
    done
fi
if [ -d "$OECORE_NATIVE_SYSROOT/environment-setup.d" ]; then
    for envfile in $OECORE_NATIVE_SYSROOT/environment-setup.d/*.sh; do
        . $envfile
    done
fi

==================================================== ================

编辑@n。 1.8e9-where's-my-share m。 [更正]

制作后,我注意到此消息是终端上 output 的一部分

C.o: linker input file unused because linking not done

并将VS2复制到环境中,我执行文件VS2

root@z-mx8mm:/usr/local# ./VS2
-sh: ./VS2: cannot execute binary file: Exec format error
root@z-mx8mmt:/usr/local# 

一开始我想可能是文件权限设置不正确

root@z-mx8mmt:/usr/local# chmod +x VS2

但上述错误仍然存在。 然后我使用文件命令

root@z-mx8mmt:/usr/local# file VS2
VS2: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), with debug_info, not stripped

这就是我得出结论的方式

展品 A:

    $(FINAL_TARGET): $(OBJ) 
        $(CXX) $(CXXFLAGS) $(ADD_INC)  ....

展品 B:

    MISC             = -std=c++11  ...

-c生成 object 文件,而不是可执行文件。 链接时您不需要任何这些 MISC 标志。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM