Makefile报错‘Missing separator’及server共享代码配置问题求助
问题解决:Makefile分隔符错误与Automake共享代码配置
一、修复"Missing separator"错误
你提供的Makefile片段里,第三行的server既不属于规则依赖,也不是合法命令(Makefile命令必须以Tab键开头)。这个错误的根源是Automake生成Makefile时,因你定义的server_SOURCES未关联任何合法目标,导致生成了无效代码,仅删除该行无法彻底解决问题,必须修正Automake配置文件(Makefile.am)。
二、消除"server_SOURCES未关联"警告
Automake中,xxx_SOURCES、xxx_CPPFLAGS这类变量与具体目标绑定:比如foo_SOURCES对应可执行程序foo,libbar_a_SOURCES对应静态库libbar.a。你定义了server_SOURCES但未创建名为server的程序或库目标,因此Automake抛出警告,同时生成错误的Makefile代码。
三、实现server代码在可执行文件A、B间共享的正确配置
根据你的需求,推荐两种方案:
方案1:编译为静态库(推荐)
将server代码打包成静态库,让A、B链接该库,避免重复编译:
# 定义静态库(noinst_表示仅用于当前项目,不安装到系统目录) noinst_LIBRARIES = libserver.a # server代码的编译参数 libserver_a_CPPFLAGS = $(example) $(example) # server的源文件(注意行尾的\不能省略,最后一行无需添加) libserver_a_SOURCES = \ init.cpp \ main.cpp \ And-so-on.cpp \ $(Program-name_H) # 定义要编译的可执行文件A和B bin_PROGRAMS = exeA exeB # 配置可执行文件A exeA_SOURCES = exeA_main.cpp # A自身的主文件 exeA_CPPFLAGS = $(libserver_a_CPPFLAGS) # 复用server的编译参数 exeA_LDADD = libserver.a # 链接静态库 # 配置可执行文件B exeB_SOURCES = exeB_main.cpp # B自身的主文件 exeB_CPPFLAGS = $(libserver_a_CPPFLAGS) exeB_LDADD = libserver.a
方案2:直接复用源文件(简单场景)
若不想构建库,可直接将server的源文件和编译参数复用给A、B:
# 定义共享的编译参数和源文件 SERVER_COMMON_CPPFLAGS = $(example) $(example) SERVER_COMMON_SOURCES = \ init.cpp \ main.cpp \ And-so-on.cpp \ $(Program-name_H) # 定义可执行文件A和B bin_PROGRAMS = exeA exeB # 配置可执行文件A exeA_SOURCES = exeA_main.cpp $(SERVER_COMMON_SOURCES) exeA_CPPFLAGS = $(SERVER_COMMON_CPPFLAGS) # 配置可执行文件B exeB_SOURCES = exeB_main.cpp $(SERVER_COMMON_SOURCES) exeB_CPPFLAGS = $(SERVER_COMMON_CPPFLAGS)
四、操作步骤
- 将当前
Makefile.am内容替换为上述任一方案 - 重新运行
./autogen.sh - 执行
./configure - 最后运行
make完成编译
内容的提问来源于stack exchange,提问作者user22945276
相关产品推荐
相关产品推荐

