使用Autotool在Windows和Mac上进行编译

时间:2010-09-14 15:05:56

标签: c++ objective-c c mingw autotools

我在尝试将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) - 输出保持完全相同。

2 个答案:

答案 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

这是未正确执行的地方。你需要检查它。