64位Linux下编译x86版本POCO库

官方文档在这里, 很详细.

仔细看来下, 由于POCO为了能够跨平台用在Windows下编译, 用的是它自己的一套Build system, 而不是标准的AutoConf, automake那一套.

正常的编译配置是:

1
./configure --omit=Data/ODBC,Data/SQLite --prefix=/usr --cflags=-fPIC --cflags=-std=c++11 --static --shared  --no-tests --no-samples

--cflags=-std=c++11选项要求GCC版本支持C++11,这样正常编译后make install会将POCO静态库和动态库安装在: prefix/lib64目录下.

后来为了编译32位版本, 简单的加了个参数--cflags=-m32, 结果这样只能编译出目标文件, 因为是强制在CFLAGS上加的-m32, 加了LDFLAGS="-m32"也无效,后来才看了下它的configure, 根本也不支持LDFLAGS参数,不是autoconf生成的, 只是一个shell.

接下来才回到上面的官方文档去查询, 找到了POCO_BASE/build/rules/目录下的几个配置文件,才了解它需要的配置参数(或者说是环境变量),这个目录下的global文件是主要的配置,关键几行在下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#
# Check if a 64bit build is requested
#
ifndef OSARCH_64BITS
OSARCH_64BITS = 0
endif

ifeq ($(OSARCH_64BITS),1)
OSARCH_POSTFIX = 64
else
OSARCH_POSTFIX =
endif

...

ifeq ($(OSARCH_64BITS),1)
CFLAGS     += $(CFLAGS64)
CXXFLAGS   += $(CXXFLAGS64)
SHLIBFLAGS += $(SHLIBFLAGS64)
DYLIBFLAGS += $(DYLIBFLAGS64)
LINKFLAGS  += $(LINKFLAGS64)
else
CFLAGS     += $(CFLAGS32)
CXXFLAGS   += $(CXXFLAGS32)
SHLIBFLAGS += $(SHLIBFLAGS32)
DYLIBFLAGS += $(DYLIBFLAGS32)
LINKFLAGS  += $(LINKFLAGS32)
endif

嗯, 就需要这几个环境变量, 还是用上面的configure命令的话, 就还需要设置下面几个环境变量:

1
2
3
4
5
export DYLIBFLAGS="-m32"
export SHLIBFLAGS="-m32"
export OSARCH_64BITS=0
export POCO_TARGET_OSARCH=i686
./configure --omit=Data/ODBC,Data/SQLite --prefix=/usr --cflags=-fPIC --static --shared  --no-tests --no-samples --cflags=-m32

这样就可以了.