2011-01-02 8 views
19

に、私は次のエラーを取得する:Macには.dylibを持っているよう"LD:不明なオプション:-soname" 私は、Mac OS X上でCMakeのと私のアプリを構築しようとするOS X

Linking CXX shared library libsml.so 
ld: unknown option: -soname 
collect2: ld returned 1 exit status 
make[2]: *** [libsml.so] Error 1 
make[1]: *** [CMakeFiles/sml.dir/all] Error 2 
make: *** [all] Error 2 

これは、奇妙です.soの代わりに拡張子。

私のCMakeLists.txtがあります:

cmake_minimum_required(VERSION 2.6) 

PROJECT (SilentMedia) 

SET(SourcePath src/libsml) 

IF (DEFINED OSS) 
SET(OSS_src 
    ${SourcePath}/Media/Audio/SoundSystem/OSS/DSP/DSP.cpp 
    ${SourcePath}/Media/Audio/SoundSystem/OSS/Mixer/Mixer.cpp 
) 
ENDIF(DEFINED OSS) 

IF (DEFINED ALSA) 
SET(ALSA_src 
    ${SourcePath}/Media/Audio/SoundSystem/ALSA/DSP/DSP.cpp 
    ${SourcePath}/Media/Audio/SoundSystem/ALSA/Mixer/Mixer.cpp 
) 
ENDIF(DEFINED ALSA) 

SET(SilentMedia_src 

    ${SourcePath}/Utils/Base64/Base64.cpp 
    ${SourcePath}/Utils/String/String.cpp 
    ${SourcePath}/Utils/Random/Random.cpp 

    ${SourcePath}/Media/Container/FileLoader.cpp 

    ${SourcePath}/Media/Container/OGG/OGG.cpp 

    ${SourcePath}/Media/PlayList/XSPF/XSPF.cpp 
    ${SourcePath}/Media/PlayList/XSPF/libXSPF.cpp 
    ${SourcePath}/Media/PlayList/PlayList.cpp 

    ${OSS_src} 
    ${ALSA_src} 

    ${SourcePath}/Media/Audio/Audio.cpp 
    ${SourcePath}/Media/Audio/AudioInfo.cpp 
    ${SourcePath}/Media/Audio/AudioProxy.cpp 

    ${SourcePath}/Media/Audio/SoundSystem/SoundSystem.cpp 
    ${SourcePath}/Media/Audio/SoundSystem/libao/AO.cpp 

    ${SourcePath}/Media/Audio/Codec/WAV/WAV.cpp 
    ${SourcePath}/Media/Audio/Codec/Vorbis/Vorbis.cpp 
    ${SourcePath}/Media/Audio/Codec/WavPack/WavPack.cpp 
    ${SourcePath}/Media/Audio/Codec/FLAC/FLAC.cpp 
) 

SET(SilentMedia_LINKED_LIBRARY 
    sml 
    vorbisfile 
    FLAC++ 
    wavpack 
    ao 
    #asound 
    boost_thread-mt 
    boost_filesystem-mt 
    xspf 
    gtest 
) 

INCLUDE_DIRECTORIES(
    /usr/include 
    /usr/local/include 
    /usr/include/c++/4.4 
    /Users/alex/Downloads/boost_1_45_0 
    ${SilentMedia_SOURCE_DIR}/src 
    ${SilentMedia_SOURCE_DIR}/${SourcePath} 
) 

#link_directories(
# /usr/lib 
# /usr/local/lib 
# /Users/alex/Downloads/boost_1_45_0/stage/lib 
#) 

IF(LibraryType STREQUAL "static") 
    ADD_LIBRARY(sml-static STATIC ${SilentMedia_src}) 
    # rename library from libsml-static.a => libsml.a 
    SET_TARGET_PROPERTIES(sml-static PROPERTIES OUTPUT_NAME "sml") 
    SET_TARGET_PROPERTIES(sml-static PROPERTIES CLEAN_DIRECT_OUTPUT 1) 
ELSEIF(LibraryType STREQUAL "shared") 
    ADD_LIBRARY(sml SHARED ${SilentMedia_src}) 

    # change compile optimization/debug flags # -Werror -pedantic 
    IF(BuildType STREQUAL "Debug") 
    SET_TARGET_PROPERTIES(sml PROPERTIES COMPILE_FLAGS "-pipe -Wall -W -ggdb") 
    ELSEIF(BuildType STREQUAL "Release") 
    SET_TARGET_PROPERTIES(sml PROPERTIES COMPILE_FLAGS "-pipe -Wall -W -O3 -fomit-frame-pointer") 
    ENDIF() 

    SET_TARGET_PROPERTIES(sml PROPERTIES CLEAN_DIRECT_OUTPUT 1) 
ENDIF() 

### TEST ### 

IF(Test STREQUAL "true") 
    ADD_EXECUTABLE (bin/TestXSPF ${SourcePath}/Test/Media/PlayLists/XSPF/TestXSPF.cpp) 
    TARGET_LINK_LIBRARIES (bin/TestXSPF ${SilentMedia_LINKED_LIBRARY}) 

    ADD_EXECUTABLE (bin/test1 ${SourcePath}/Test/test.cpp) 
    TARGET_LINK_LIBRARIES (bin/test1 ${SilentMedia_LINKED_LIBRARY}) 

    ADD_EXECUTABLE (bin/TestFileLoader ${SourcePath}/Test/Media/Container/FileLoader/TestFileLoader.cpp) 
    TARGET_LINK_LIBRARIES (bin/TestFileLoader ${SilentMedia_LINKED_LIBRARY}) 

    ADD_EXECUTABLE (bin/testMixer ${SourcePath}/Test/testMixer.cpp) 
    TARGET_LINK_LIBRARIES (bin/testMixer ${SilentMedia_LINKED_LIBRARY}) 
ENDIF (Test STREQUAL "true") 

### TEST ### 

ADD_CUSTOM_TARGET(doc COMMAND doxygen ${SilentMedia_SOURCE_DIR}/doc/Doxyfile) 

Linux上のエラーはありませんでした。

ビルドプロセス:

cmake -D BuildType=Debug -D LibraryType=shared . 
make 

私は間違ったコマンドがCMakeFiles/sml.dir/link.txtに生成することを発見しました。しかし、なぜCMakeの目標がクロスプラットフォームであるのか。

それを修正するには?

+0

私はCMakeが分かりませんが、ここに提案があります:MacPortsやFinkの下に構築されたCMakeベースのプロジェクトを見てみましょう。Mac OS Xで構築するためにパッチを当てています。 –

答えて

5

問題はどこにあるのですか。ビルドする前に、すべてのCMakeの一時フォルダとファイルを削除する必要があります。 CMakeFiles,CMakeCache.txt,Makefile。私の場合のように、問題は私がLinuxにそのプロジェクトを構築し、これらのファイルを削除していないということです... その理由は.soの拡張子です...

+0

:)このような間違いを避けるため、新しいプロジェクトファイル、私はいつもrm -rfをビルドしてcmakeを実行します。 –

+5

ソースツリー内でプロジェクトをビルドするのではなく、ソースツリーの外にビルドディレクトリを作成してください。 – RobertJMaynard

+0

私は同様の問題を抱えています - > http://stackoverflow.com/questions/31588546/set-cmake-to-use-dyld-options-instead-gnu-ld-options-under-os-x。残念ながら、あなたのソリューションは私の問題には適用されません。どのコンパイラを使っているのか、CMakeを使ってどのように呼び出すのかを教えてください。 – fotinsky

53

私はOS Xで同じ問題を抱えていました。 sonameの代わりにinstall_nameスイッチを使用します。

gcc -shared <files> -lc -Wl,-install_name,<libname>.so, -o <libname>.so.1 
+1

なぜこれを行う必要がありますか? – Blaze349

+0

誰か良い説明がありますか? –

1

あなたは問題だクリアし、私はこれは、将来の訪問者のためのリファレンス■OS X上で動的ライブラリを作成するにもう少しがありますので、またAppleデベロッパページでCreating Dynamic Librariesを見提供したかったです。

OS Xでは規約libcoolstuff.so.X.Y.Zを使用していません。 OS Xは規約libcoolstuff.X.dylibを使用します。ライブラリにX.Y.Zを埋め込むには、-install_name,-current_versionおよび-compatibility_versionを使用します。

私はCmakeについては分かりませんが、ここでMakeの見た目です。 libcoolstuff 1.0.6を構築するためにあなたのレシピは次のようになります。

libcoolstuff libcoolstuff.dylib: 
    $(CC) $(CFLAGS) -dynamiclib -install_name "libcoolstuff.1.dylib" \ 
    -current_version 1.0.6 -compatibility_version 1.0 -o libcoolstuff.1.dylib $(OBJS) 

そして、あなたのmake installルールは次のようになります。

最後に
$ otool -L libcoolstuff.dylib 
libcoolstuff.dylib: 
    libcoolstuff.1.dylib (compatibility version 1.0.0, current version 1.0.6) 
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.7) 

otoolの下

PREFIX?=/usr/local 
LIBDIR?=$(PREFIX)/lib 
... 

install: 
    cp -f libcoolstuff.1.dylib $(LIBDIR)/libcoolstuff.1.dylib 
    rm -f $(LIBDIR)/libcoolstuff.dylib 
    ln -s $(LIBDIR)/libcoolstuff.1.dylib $(LIBDIR)/libcoolstuff.dylib 
    install_name_tool -change "libcoolstuff.1.dylib" "$(LIBDIR)/libcoolstuff.1.dylib" $(LIBDIR)/libcoolstuff.1.dylib 

、それは次のようになります期待通りに使用してください:

export CFLAGS="-NDEBUG -g2 -O2 -Wall -arch ppc -arch ppc64" 
make 
... 
関連する問題