1

我正在尝试在 Mac OS X Lion、gcc4.8、XCode 5.0.2 下构建这个库:

https://github.com/zeromq/zmqpp

我用以下方法构建了 gcc4.8:

brew install gcc48 --enable-all-languages

当我尝试构建它时,链接器(在 /usr/bin 中)给出了以下错误:

$ make
mkdir -p build/max-g++/obj/zmqpp/
g++   -MMD -std=c++0x -pipe -Wall -fPIC -DBUILD_ENV=max -DBUILD_VERSION='"3.2.0"' -DBUILD_VERSION_MAJOR=3 -DBUILD_VERSION_MINOR=2 -DBUILD_VERSION_REVISION=0 -DBUILD_DATESTAMP='"2014-05-13 07:14"' -DBUILD_LIBRARY_NAME='"zmqpp"' -DBUILD_CLIENT_NAME='"zmqpp"' -I./src -O3 -funroll-loops -ffast-math -finline-functions -fomit-frame-pointer -DNDEBUG -c -o build/max-g++/obj/zmqpp/context.o src/zmqpp/context.cpp
mkdir -p build/max-g++/obj/zmqpp/
g++   -MMD -std=c++0x -pipe -Wall -fPIC -DBUILD_ENV=max -DBUILD_VERSION='"3.2.0"' -DBUILD_VERSION_MAJOR=3 -DBUILD_VERSION_MINOR=2 -DBUILD_VERSION_REVISION=0 -DBUILD_DATESTAMP='"2014-05-13 07:14"' -DBUILD_LIBRARY_NAME='"zmqpp"' -DBUILD_CLIENT_NAME='"zmqpp"' -I./src -O3 -funroll-loops -ffast-math -finline-functions -fomit-frame-pointer -DNDEBUG -c -o build/max-g++/obj/zmqpp/frame.o src/zmqpp/frame.cpp
mkdir -p build/max-g++/obj/zmqpp/
g++   -MMD -std=c++0x -pipe -Wall -fPIC -DBUILD_ENV=max -DBUILD_VERSION='"3.2.0"' -DBUILD_VERSION_MAJOR=3 -DBUILD_VERSION_MINOR=2 -DBUILD_VERSION_REVISION=0 -DBUILD_DATESTAMP='"2014-05-13 07:14"' -DBUILD_LIBRARY_NAME='"zmqpp"' -DBUILD_CLIENT_NAME='"zmqpp"' -I./src -O3 -funroll-loops -ffast-math -finline-functions -fomit-frame-pointer -DNDEBUG -c -o build/max-g++/obj/zmqpp/message.o src/zmqpp/message.cpp
mkdir -p build/max-g++/obj/zmqpp/
g++   -MMD -std=c++0x -pipe -Wall -fPIC -DBUILD_ENV=max -DBUILD_VERSION='"3.2.0"' -DBUILD_VERSION_MAJOR=3 -DBUILD_VERSION_MINOR=2 -DBUILD_VERSION_REVISION=0 -DBUILD_DATESTAMP='"2014-05-13 07:14"' -DBUILD_LIBRARY_NAME='"zmqpp"' -DBUILD_CLIENT_NAME='"zmqpp"' -I./src -O3 -funroll-loops -ffast-math -finline-functions -fomit-frame-pointer -DNDEBUG -c -o build/max-g++/obj/zmqpp/poller.o src/zmqpp/poller.cpp
mkdir -p build/max-g++/obj/zmqpp/
g++   -MMD -std=c++0x -pipe -Wall -fPIC -DBUILD_ENV=max -DBUILD_VERSION='"3.2.0"' -DBUILD_VERSION_MAJOR=3 -DBUILD_VERSION_MINOR=2 -DBUILD_VERSION_REVISION=0 -DBUILD_DATESTAMP='"2014-05-13 07:14"' -DBUILD_LIBRARY_NAME='"zmqpp"' -DBUILD_CLIENT_NAME='"zmqpp"' -I./src -O3 -funroll-loops -ffast-math -finline-functions -fomit-frame-pointer -DNDEBUG -c -o build/max-g++/obj/zmqpp/socket.o src/zmqpp/socket.cpp
mkdir -p build/max-g++/obj/zmqpp/
g++   -MMD -std=c++0x -pipe -Wall -fPIC -DBUILD_ENV=max -DBUILD_VERSION='"3.2.0"' -DBUILD_VERSION_MAJOR=3 -DBUILD_VERSION_MINOR=2 -DBUILD_VERSION_REVISION=0 -DBUILD_DATESTAMP='"2014-05-13 07:14"' -DBUILD_LIBRARY_NAME='"zmqpp"' -DBUILD_CLIENT_NAME='"zmqpp"' -I./src -O3 -funroll-loops -ffast-math -finline-functions -fomit-frame-pointer -DNDEBUG -c -o build/max-g++/obj/zmqpp/zmqpp.o src/zmqpp/zmqpp.cpp
g++  -shared -dynamic -Wl,libzmqpp.so.3 -o ./build/max-g++/libzmqpp.so.3 build/max-g++/obj/zmqpp/context.o build/max-g++/obj/zmqpp/frame.o build/max-g++/obj/zmqpp/message.o build/max-g++/obj/zmqpp/poller.o build/max-g++/obj/zmqpp/socket.o build/max-g++/obj/zmqpp/zmqpp.o  -lzmq
ld: file not found: libzmqpp.so.3
collect2: error: ld returned 1 exit status
make: *** [libzmqpp.so] Error 1

所以我删除了 dynamic 前面的 r 以便它读取

-dynamic

这似乎没问题。但是,然后我得到

Mac-mini:zmqpp ivan$ make
g++  -shared -dynamic -Wl,-soname -Wl,libzmqpp.so.3 -o ./build/max-g++/libzmqpp.so.3 build/max-g++/obj/zmqpp/context.o build/max-g++/obj/zmqpp/frame.o build/max-g++/obj/zmqpp/message.o build/max-g++/obj/zmqpp/poller.o build/max-g++/obj/zmqpp/socket.o build/max-g++/obj/zmqpp/zmqpp.o  -lzmq
ld: unknown option: -soname
collect2: error: ld returned 1 exit status
make: *** [libzmqpp.so] Error 1

我不知道如何摆脱这个错误。如果我只是从 Makefile 中删除 -soname,我会得到

Mac-mini:zmqpp ivan$ make
g++  -shared -dynamic -Wl,libzmqpp.so.3 -o ./build/max-g++/libzmqpp.so.3 build/max-g++/obj/zmqpp/context.o build/max-g++/obj/zmqpp/frame.o build/max-g++/obj/zmqpp/message.o build/max-g++/obj/zmqpp/poller.o build/max-g++/obj/zmqpp/socket.o build/max-g++/obj/zmqpp/zmqpp.o  -lzmq
ld: file not found: libzmqpp.so.3
collect2: error: ld returned 1 exit status
make: *** [libzmqpp.so] Error 1

libzmqpp.so.3 看起来甚至不像 Mac 动态库的正确协议。

如果我删除整行并替换它,我会得到

Mac-mini:zmqpp ivan$ make
g++  -shared -dynamic -o ./build/max-g++/libzmqpp.so.3 build/max-g++/obj/zmqpp/context.o build/max-g++/obj/zmqpp/frame.o build/max-g++/obj/zmqpp/message.o build/max-g++/obj/zmqpp/poller.o build/max-g++/obj/zmqpp/socket.o build/max-g++/obj/zmqpp/zmqpp.o  -lzmq
ar crf ./build/max-g++/libzmqpp.a build/max-g++/obj/zmqpp/context.o build/max-g++/obj/zmqpp/frame.o build/max-g++/obj/zmqpp/message.o build/max-g++/obj/zmqpp/poller.o build/max-g++/obj/zmqpp/socket.o build/max-g++/obj/zmqpp/zmqpp.o
ar: illegal option -- f
usage:  ar -d [-TLsv] archive file ...
    ar -m [-TLsv] archive file ...
    ar -m [-abiTLsv] position archive file ...
    ar -p [-TLsv] archive [file ...]
    ar -q [-cTLsv] archive file ...
    ar -r [-cuTLsv] archive file ...
    ar -r [-abciuTLsv] position archive file ...
    ar -t [-TLsv] archive [file ...]
    ar -x [-ouTLsv] archive [file ...]
make: *** [libzmqpp.a] Error 1

一件事,它使用的 ar 是 /usr/bin 而不是 /usr/local/Cellar/gcc48/4.8.2/bin/gcc, gcc-ar-4.8

4

1 回答 1

1
g++ -dynamiclib -Wl,-headerpad_max_install_names,-undefined,dynamic_lookup,-current_version,1.0,-install_name,/usr/local/lib/libzmqpp.3.dylib -o libzmqpp.1.dylib ./build/max-g++/obj/zmqpp/context.o ./build/max-g++/obj/zmqpp/frame.o ./build/max-g++/obj/zmqpp/message.o ./build/max-g++/obj/zmqpp/poller.o ./build/max-g++/obj/zmqpp/socket.o ./build/max-g++/obj/zmqpp/zmqpp.o -lzmq 

根据这个问题,这应该有效。我会尝试使用和不使用 -dynamic。我整天都在构建共享库,但没有 Mac。我不确定它为什么要尝试使用 ar 命令构建静态库。

mac 链接器不采用 linux 的参数。 以下是有关在 Mac 上构建共享库的一些信息。

于 2014-05-13T12:33:25.647 回答