Ale*_*yuv 24 macos makefile cmake shared-libraries
我尝试在Mac OS X上使用CMake构建我的应用程序,我收到以下错误:
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
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为Mac有.dylib扩展而不是.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)
Run Code Online (Sandbox Code Playgroud)
Linux上没有错误.
构建过程:
cmake -D BuildType=Debug -D LibraryType=shared .
make
Run Code Online (Sandbox Code Playgroud)
我发现,生成错误的命令CMakeFiles/sml.dir/link.txt.但是,为什么,因为CMake的目标是跨平台..
怎么解决?
Cou*_*sen 68
我在OS X上遇到了类似的问题,我使用install_name开关而不是soname.
gcc -shared <files> -lc -Wl,-install_name,<libname>.so, -o <libname>.so.1
Run Code Online (Sandbox Code Playgroud)
您清除了您的问题,但我想提供此作为未来访问者的参考,因为在 OS X 上创建动态库还有更多内容。另请参阅Apple 开发人员页面中的创建动态库。
OS X 不使用约定libcoolstuff.so.X.Y.Z。OS X 使用约定libcoolstuff.X.dylib。, 嵌入X.Y.Z到库中,使用-install_name,-current_version和-compatibility_version。
我不知道 Cmake,但这是它在 Make 下的样子。您构建libcoolstuff1.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)
Run Code Online (Sandbox Code Playgroud)
你的make install规则看起来像:
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
Run Code Online (Sandbox Code Playgroud)
在 下otool,它看起来像:
$ 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)
Run Code Online (Sandbox Code Playgroud)
最后,您将按预期使用它:
export CFLAGS="-NDEBUG -g2 -O2 -Wall -arch ppc -arch ppc64"
make
...
Run Code Online (Sandbox Code Playgroud)
好的,我发现了问题所在.构建之前,你必须删除所有的CMake临时文件夹和文件,例如CMakeFiles,CMakeCache.txt,Makefile.在我的情况下,问题是我构建了该项目Linux并且没有删除这些文件......这就是为什么有.so扩展...
| 归档时间: |
|
| 查看次数: |
27525 次 |
| 最近记录: |