gpt4 book ai didi

c++ - 使用单个 makefile 编译 C 和 C++

转载 作者:行者123 更新时间:2023-11-30 16:10:56 25 4
gpt4 key购买 nike

我正在尝试创建一个使用我的 earlier created shared library, which by the way is now static 的可执行文件其中包括 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)

但是我无法让它发挥作用。我收到了很多对我的库定义的符号的 undefined reference 。我已经在 cpp 文件中的这些符号周围使用了 extern C,但它似乎没有帮助。

顺便说一句,还有比这更直接或更简单的方法吗?

此外,在浏览此处的各种答案时,我发现这样的说法:像 .c.o 这样的目标已经相当过时,不应再使用。是否有最新的、详尽的、实用的 Makefile 指南(是不是要求太多了)?

更新1:所以在这里我可以访问日志,我注意到我收到的所有 undefined reference 错误都与我静态链接到共享库的SSL库定义的符号有关。我的错误日志示例:

/home/AB/Documents/APP/APP_2.17.0_Linux/libAPP.so: undefined reference to `SSL_CTX_free'
/home/AB/Documents/APP/APP_2.17.0_Linux/libAPP.so: undefined reference to `X509_set_issuer_name'

所以我想到制作一个静态库,它将在内部链接(或者更确切地说合并)libssl.aModified my aforementioned makefile并创建了一个静态libAPP.a。但我仍然不断收到这些错误。

我最终将 libssl.alibcrypto.a 添加到这个 makefile 中,瞧,很多错误都得到了修复。我仍然遇到一些与 dlopen 和 pthreads 相关的错误,因此我也添加了这些错误。我还使用 CXX 编译器编译所有内容,以消除由于名称修改而导致的问题。

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

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

/usr/bin/ld: cannot find -lz

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

最佳答案

我将按照以下步骤执行此操作:

  1. 收集所有命令以“手动”构建所有内容。如果您是初学者,只有当这种方法有效时,才有意义继续前进。这些命令可以放入批处理文件中。
  2. 提取依赖关系和规则。
  3. 将其写入 Makefile 中;归根结底,Makefile 就是:如何构建的浓缩知识。
  4. 尝试 Makefile。
  5. 如果遇到错误,我将使用 make 的选项 -d-p-n 来查看它的想法。可能还有更多有用的选项。

关于c++ - 使用单个 makefile 编译 C 和 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58771714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com