我想编辑现有软件以添加新的源文件(Source.cpp)。 但是,我无法管理编译过程(它似乎是自动化,看起来非常复杂)。
软件(iperf 2:https://sourceforge.net/projects/iperf2/files/?source=navbar)使用经典./configure
make
然后make install
编译。
如果我只是将文件添加到相应的源和包含目录,我收到此错误消息:
Settings.cpp:(.text+0x969) : undefined reference to ...
看起来makefile无法生成与我的新源文件(Source.cpp)关联的输出文件。所以,我可能需要在某处手动指出它。
我在项目文件中搜索了一下,似乎要编辑的文件是:“Makefile.am”。
我将我的源添加到该文件中的变量iperf_SOURCES
但它没有工作。
你能帮我找到我需要指出我的新源文件的文件(这似乎是一个非常标准的编译方案,但我从未使用过automake软件,这个看起来非常复杂)。
提前谢谢
答案 0 :(得分:2)
这个项目是使用autotools构建的,正如您已经想到的那样。
makefile由automake构建。它在通常具有am
文件扩展名的文件中输入。
iperf程序由src/Makefile.am
生成的makefile构建。这表示为:
bin_PROGRAMS = iperf
所有(实际上这是一个简化,但在这种情况下保留)要构建的二进制文件的源文件位于相应的名称 _SOURCES变量中,因此在这种情况iperf_SOURCES
。只需将源文件添加到该列表的末尾,就像这样(保持其格式化):
iperf_SOURCES = \
Client.cpp \
# lines omitted
tcp_window_size.c \
my_new_file.c
现在,要在将来生成src/Makefile
的任何内容中反映此更改,您需要运行automake。这将修改src/Makefile.in
,这是config.sub
使用的模板1}}在configure
的末尾生成实际的makefile。
运行automake可以通过各种方式实现:
如果您已经拥有在配置后生成的makefile,则这些应该负责重建自己。这有时似乎失败了!
您可以手动运行automake(在顶级目录中)。我从未这样做过,因为有更好的解决方案......
在顶级目录中运行autoreconf --install
(可能在参数中添加--force
)。这将重新生成整个构建系统,调用所有需要的程序,如autoheader,autoconf,当然还有automake。 这是我最喜欢的解决方案。
后两个选项需要再次调用configure,理想情况下IMO执行out of source build:
# in top level dir
mkdir build
cd build
../configure # arguments
make # should now also compile and link your new source file