C++ 编译C和C++;使用单个makefile

C++ 编译C和C++;使用单个makefile,c++,c,makefile,linker,mixed-mode,C++,C,Makefile,Linker,Mixed Mode,我正在尝试创建一个使用my的可执行文件,其中包括openSSL静态库。所以我使用了我用来创建这个库的同一个Makefile,并对它进行了黑客攻击,使它在这里工作。这就是它的样子 LIBBASE=/home/AB/Documents/APP/APP_2.17.0 OPENSSL1.0.2p_INSTALL_LOC=/home/AB/Documents/APP/OpenSSL-1.0.2p-installation CC=gcc CXX=g++ CFLAGS= -Wall -g -pedantic

我正在尝试创建一个使用my的可执行文件,其中包括openSSL静态库。所以我使用了我用来创建这个库的同一个Makefile,并对它进行了黑客攻击,使它在这里工作。这就是它的样子

LIBBASE=/home/AB/Documents/APP/APP_2.17.0
OPENSSL1.0.2p_INSTALL_LOC=/home/AB/Documents/APP/OpenSSL-1.0.2p-installation
CC=gcc
CXX=g++
CFLAGS= -Wall -g -pedantic
CPPFLAGS= -Wall -g -pedantic 
RM= rm -f
.PHONY: all clean

c_src=$(shell find . -iname "*.c")
$(info source=$(c_src))

cpp_src=$(shell find . -iname "*.cpp")
$(info cppsource=$(cpp_src))

INC=-I$(LIBBASE)/include
$(info includes=$(INC))

# need to link pthread library here as well
LIB = -pthread

# aforementioned library
LIB+=-L$(LIBBASE)/lib 
LIB+= -l:libSCA.a

#need to add SSL related libraries
LIB+= -L$(OPENSSL1.0.2p_INSTALL_LOC)/lib
LIB+= -l:libssl.a -l:libcrypto.a -static-libgcc

# As mentioned, we need to link dl and libz libraries as well
LIB+= -ldl -lz

$(info links=$(LIB))

obj=$(c_src:.c=.o) $(cpp_src:.cpp=.o)
all: APP
clean:
    $(RM) *.o APP
    $(shell find $(APPBASE) -type f -iname "*.o" -exec rm -rf {} \;)

.c.o:
    ${CXX} -static ${CPPFLAGS} $(INC) -c $< -o $@
    #${CC} -static ${CFLAGS} $(INC) -c $< -o $@

.cpp.o:
    ${CXX} -static ${CPPFLAGS} $(INC) -c $< -o $@

APP: $(obj)
    $(LINK.cxx) $^ -o $@ $(LIB)
所以我想制作一个静态库,它将在内部链接(或者更确切地说是合并)
libssl.a
。并创建了一个静态的
libAPP.a
。但我还是不断地犯这些错误

我最后在这个makefile中添加了
libssl.a
libcrypto.a
,瞧,很多错误都被修复了。我仍然有一些与
dlopen
和pthreads相关的错误,所以我也添加了这些错误。我还使用CXX编译器编译所有内容,以消除由于名称混乱而导致的问题

现在让我感到困扰的是,SSL相关符号应该已经存在于
libAPP.a
中(尽管
nm
报告它们未定义,这本身可能需要另一个问题:D)。但是我仍然需要在这里指定
libSSL.a
libcrypto.a
,以便链接器找到它们!那么,创建存档(
libAPP.a
)而不是共享库(
libAPP.So
)有什么好处呢

最后,在链接阶段,我的链接器找不到lz

/usr/bin/ld: cannot find -lz

只是为了见鬼,我尝试将相同的标志添加到创建该归档文件的makefile中,并且找到它没有问题。有什么建议吗?

我会在以下步骤中完成:

  • 收集所有命令来“手工”构建所有东西。只有这样,如果你是初学者,继续前进才有意义。这些命令可以放在批处理文件中
  • 提取依赖项和规则
  • 将其写入Makefile;归根结底,Makefile就是:如何构建的浓缩知识
  • 试试Makefile
  • 如果我遇到错误,我将使用make的选项
    -d
    -p
    -n
    查看它的想法。也许还有更有用的选择

  • <>最明显的问题是,当你的程序包含C++组件时,你使用<代码> $(link .c)< /C>链接,所以你没有得到任何C++库或类似的东西。尝试使用<代码>(链接.c)<代码> $[链接(c])>代码> > $(link .CPP)< /> >或>代码> $(link .cxx)< /C>(在C++版本中,您需要的版本不同,但至少其中一个应该是预先定义的)。< / GnuMake的手册有一些启发性的章节。当然,我确信。但是,作为一个生产环境,我希望您理解我的时间相当短(这几天开发人员不是:)。如果您有一个快速修复,或者可以指出其中的一个明显缺陷,或者建议一个更简单的方法来处理类似的事情,我将不胜感激@顺便说一句,当我放松的时候,我一定会去看看那些章节,希望学习一些新的东西。你应该明白的第一件事是,你的问题不是make或makefile。如果出现链接错误,这意味着问题在于编译或链接命令错误。因此,试图将其归咎于make或makefile不会有任何效果。如果您不熟悉如何将编译器和链接器与共享库一起使用,那么一个有用的练习是尝试在shell提示符下直接运行compile命令,直到找到正确的命令。然后,你可以担心如何将它们放入你的MaCube文件中。最有效的方法是:“代码> > CXXFLAGG/<代码>是C++编译器的标志,而 CppFLAGS < /C>是C预处理器的标志。我想把所有的对象文件链接成一个可执行文件。从C文件生成的以及从cpp文件生成的。若“LINK.c”不是正确的方法,那个么什么是正确的方法呢?试试
    $(LINK.cpp)
    --或者其他方法之一,若在您使用的make版本中并没有定义的话。make会直接推断出{LINK.cpp},还是需要显式定义它?另外,我是否可以链接所有对象,而不管它们的源是什么(C/C++)??
    /usr/bin/ld: cannot find -lz