使用 Automake 编译 *.cpp 和 *.c

     2023-02-22     294

关键词:

【中文标题】使用 Automake 编译 *.cpp 和 *.c【英文标题】:Compile *.cpp and *.c with Automake 【发布时间】:2020-06-16 10:13:28 【问题描述】:

结构:

-myProject
    -Makefile.am
    -configure.ac
    -src
        -Makefile.am
        -main.c
        -test.c
        -test.h

当我尝试编译时,我收到错误未定义的对 test.c 中函数的引用。

Makefile.am:

   AUTOMAKE_OPTIONS = foreign
   SUBDIRS=src

src/Makefile.am:

   bin_PROGRAMS = TEST
   AM_CXXFLAGS =-Wall -Wno-psabi -w -pthread -I/usr/local/include
   AM_CFLAGS =-Wall -w
   #Sources
   TEST_SOURCES = test.c main.cpp
   TEST_LDADD = @LDFLAGS@ -lmosquitto
   TEST_LDFLAGS =-lmosquitto 

似乎无法链接这两个来源。有人可以帮帮我吗?

错误:

make  all-recursive
make[1]: Entering directory '/media/sf_Shared/Software/executables/TEST'
Making all in src
make[2]: Entering directory '/media/sf_Shared/Software/executables/TEST/src'
g++ -DHAVE_CONFIG_H -I. -I..    -Wall -Wno-psabi -w -pthread -I/usr/local/include -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
mv -f .deps/main.Tpo .deps/main.Po
g++ -Wall -Wno-psabi -w -pthread -I/usr/local/include  -g -O2 -lmosquitto   -o TEST test.o main.o -lmosquitto 
/usr/bin/ld: main.o: in function `main':
/media/sf_Shared/Software/executables/TEST/src/main.cpp:564: undefined reference to `open_ports(unsigned int, unsigned int)'
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:366: TEST] Error 1
make[2]: Leaving directory '/media/sf_Shared/Software/executables/TEST/src'
make[1]: *** [Makefile:359: all-recursive] Error 1
make[1]: Leaving directory '/media/sf_Shared/Software/executables/TEST'
make: *** [Makefile:300: all] Error 2

我在 main.cpp 中包含了 test.h。有声明的函数open_ports(u_int32_t open_ports(u_int32_t a, u_int32_t b);),在test.c中实现

【问题讨论】:

引用完整的错误并显示它适用的调用/函数。展示如何声明该函数以及如何调用它。可能是 C/C++ 链接的混合让你感到困惑。 仅供参考,与实际问题无关:将@LDFLAGS@ 添加到非_LDFLAGS 变量看起来很可疑。改为将其添加到 _LDFLAGS 【参考方案1】:

这不是automake 的问题——您在Makefile.am 中做的事情是正确的(或至少接近于)。

问题是你的符号是在没有extern "C"的情况下声明的,但只在C中定义,所以当C++编译器接受你的main.cpp时,它期望找到一个mangled符号(它编码了函数的签名,即参数的数量和类型),而不是普通的(C)。

您可以说是这种情况,因为它正在寻找open_ports(unsigned int, unsigned int),而不仅仅是open_ports

最简单的解决方案是将您的main.cpp 更改为:

extern "C" 
#include "test.h"

这表明test.h 标头仅包含C 声明,然后将为您在test.c 中定义的内容生成正确的符号查找。

【讨论】:

我会将extern "C" 行包含到test.h 文件本身中,但每个行都包含在#ifdef __cplusplus#endif 中。这样,您就可以在任何 C 和 C++ 文件中包含 test.h 我认为这是风格问题上的一个争论点 :) 我不喜欢在仅 C 的标头中混合 C++ 构造 (extern "C"),而是非常注意使用“外语” (C) 来自 C++。

automake 第三方库

】automake第三方库【英文标题】:automakethirdpartylibraries【发布时间】:2015-06-0523:18:44【问题描述】:如何用automake编译和链接第三方库?我的文件结构是:program/|+--src/|||+--Makefile.am|+--main.cpp|+--lib/|||+--Makefile.am|+--library.cpp|+--Makefile.... 查看详情

使用 automake 将子目录编译成库的最佳方法?

】使用automake将子目录编译成库的最佳方法?【英文标题】:Bestwaytocompilesubdirectoriesintolibrarieswithautomake?【发布时间】:2018-06-2607:39:56【问题描述】:我有以下文件├──configure.ac├──main.cpp├──Makefile.am└──procs├──Makef... 查看详情

生成一个 Makefile,使用 Automake 一步编译和链接所有源文件

】生成一个Makefile,使用Automake一步编译和链接所有源文件【英文标题】:GenerateaMakefilethatcompilesandlinksallthesourcefilesinasinglestepwithAutomake【发布时间】:2020-02-1518:13:43【问题描述】:我是automake的新手。我正在尝试为我的库编写Makef... 查看详情

在 automake 中使用通配符

】在automake中使用通配符【英文标题】:Usingwildcardsinautomake【发布时间】:2016-04-1415:05:08【问题描述】:我有以下makefile.am:AUTOMAKE_OPTIONS=foreignbin_PROGRAMS=progDEFS=CFLAGS=prog_SOURCES:=$(wildcardsrc/GUI_dialogs.cpp)src/GUI_main_win.cpp$(info** 查看详情

如何使用 automake 编译同一程序的 MPI 和非 MPI 版本?

】如何使用automake编译同一程序的MPI和非MPI版本?【英文标题】:howtocompileMPIandnon-MPIversionofthesameprogramwithautomake?【发布时间】:2010-10-1913:10:01【问题描述】:我有一个可以使用MPI支持编译的C++代码,具体取决于某些预处理器标志... 查看详情

Automake:每个目标编译器

】Automake:每个目标编译器【英文标题】:Automake:pertargetcompiler【发布时间】:2014-09-2210:42:24【问题描述】:我正在使用自定义编译链,并且我有多个需要编译的目标,但是它们需要使用不同的cxx编译器进行编译。这可以使用自... 查看详情

linux下automake工具使用(自动构建makefile文件)

...比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Automake的工具,用来自动生成makefile文件,为编译和安装程序提供了一个方便快捷的入口。无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进... 查看详情

使用 libtool 和 autoconf 构建 ASM 代码

...间】:2015-05-2112:59:45【问题描述】:我正在使用libtool和automake来构建我们的项目。项目有CPP和ASM代码。正确构建CPP代码并创建.o文件。要构建ASM代码,请参阅配置中给出的说明AM_PROG_AS,CCASFLAGSASM代码似乎没有构建。在编译摘要中... 查看详情

Automake:如何为编译器命令添加前缀

】Automake:如何为编译器命令添加前缀【英文标题】:Automake:Howtoprefixacommandtocompilercommand【发布时间】:2017-05-0211:58:16【问题描述】:以下引用来自scorep的文档。为了使用该软件,scorep命令被称为编译器前缀,即mpicc。我正在使... 查看详情

automake 的自动检测源

】automake的自动检测源【英文标题】:Autodetectsourceforautomake【发布时间】:2015-01-0710:17:11【问题描述】:我正在尝试做一个Makefile.am,它会在运行时(make)找到所有依赖项(c和cpp文件)。我测试了这个命令:example_SOURCES=$(shellfind.-ty... 查看详情

autoconf/automake:基于库存在的条件编译?

】autoconf/automake:基于库存在的条件编译?【英文标题】:autoconf/automake:conditionalcompilationbasedonpresenceoflibrary?【发布时间】:2011-07-0719:25:46【问题描述】:我需要根据库的存在有条件地编译一些代码。使用autoconf/automake似乎应该很... 查看详情

指示 Automake 对 *.S 文件使用 C++ 编译器?

】指示Automake对*.S文件使用C++编译器?【英文标题】:InstructAutomaketouseC++compilerfor*.Sfiles?【发布时间】:2018-07-2821:58:45【问题描述】:我们有一个C++项目。我们需要通过编译器组装一个*.S文件。在我们的GNUmakefile中,我们使用:#AR... 查看详情

用于创建库和使用它的程序的 automake

】用于创建库和使用它的程序的automake【英文标题】:automakeforcreatingalibandprogramusingit【发布时间】:2010-08-1709:40:52【问题描述】:我正在尝试开发一个程序,该程序使用在同一项目中完成的另一个内部库。我想链接两者。该库存... 查看详情

如何使用 CMake 分别编译 *.cpp 和 *.cu?

】如何使用CMake分别编译*.cpp和*.cu?【英文标题】:HowtouseCMaketocompile*.cppand*.cuseperately?【发布时间】:2021-12-1912:30:23【问题描述】:我想实现一个Matrix类,我想使用CUDA来加速矩阵乘法。但是当我尝试编译源文件时。我遇到了一些... 查看详情

Autotools 交叉编译和生成源

...0318:33:54【问题描述】:我正在尝试使用autotools(autoconf、automake、libtool)作为构建系统来创建一个库。该库必须是可交叉编译的,但构建它的步骤之一是在整个过程中通过从源构建的可执行文件生成源。问题是我不能使用automake... 查看详情

交叉编译一个automake项目?

】交叉编译一个automake项目?【英文标题】:CrossCompileaautomakeproject?【发布时间】:2017-05-0107:26:25【问题描述】:我正在为enocean开发一个应用程序。我可以为我的主机系统编译它。我想为运行openwrt的beagleboneblack交叉编译它。我有... 查看详情

linux下automake工具使用(自动构建makefile文件)

...,所幸在GNU的计划中,设计出了一种叫做Autoconf/Automake的工具,用来自动生成makefile文件,为编译和安装 查看详情

linux下automake工具使用(自动构建makefile文件)

...,所幸在GNU的计划中,设计出了一种叫做Autoconf/Automake的工具,用来自动生成makefile文件,为编译和安装 查看详情