我在尝试将autotools用于一个简单的人工项目时遇到了问题,任务很简单,在Mac OSX上使用Objective-C,在Windows上使用C ++(mingw) - 中间有一些C
粘合剂。
项目结构如下(减去所有自动生成的文件):
./aclocal.m4
./configure
./configure.ac
./Makefile.am
./src/darwin/greet.m
./src/greet.h
./src/main.cpp
./src/Makefile.am
./src/mingw32/greet.cpp
密钥文件的内容位于github in a gist。 (此处不想发送垃圾邮件)
我在更改之间使用以下命令:
$ autoreconf -vis && ./configure && make
我收到的错误是完整输出(here in another gist):
....
Making all in src
g++ -g -O2 -o greetings main.o
Undefined symbols:
"greet()", referenced from:
_main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[1]: *** [greetings] Error 1
make: *** [all-recursive] Error 1
我对autotools很新,并且在IRC的几个好人的帮助下走了很长的路,但我想我在这里犯了一个概念上的错误,真的希望我犯的是一个简单的错误
我从文档中了解到EXTRA_progname_SOURCES
应该包含所有可能的文件,并且设置的条件应该可以用来选择正确的文件。
令人震惊的是,我认为我的makefile文件没有被重新制作,因为即使我更改src/Makefile.am
中的行以明确包含我的平台的源代码(大部分时间都是Max OS X Darwin) - 输出保持完全相同。
答案 0 :(得分:1)
我发现你在要点中指的是greet.mm
,但在问题中指的是greet.m
。 Automake似乎不是natively support Objective-C ++代码。对于Objective-C代码,您需要在AC_PROG_OBJC
中使用configure.ac
。如果您真的需要Objective-C ++代码,则需要执行此操作via a suffix rule。
答案 1 :(得分:0)
g ++ -g -O2 -o greetings main.o
此行尝试构建可从main.o执行的问候语。如果greet()函数在某个其他文件中定义,例如greet.cpp,则它应该是:
++ -g -O2 -o greetings main.o greet.o
可能来自Makefile.am的这一行
greetings_SOURCES = main.cpp greet.h
应该是这样的:
greetings_SOURCES = main.cpp greet.cpp
在Makefile.am中你有:
if OS_DARWIN greetings_SOURCES += darwin/greet.mm endif if OS_MINGW32 greetings_SOURCES += mingw32/greet.cpp endif
这是未正确执行的地方。你需要检查它。