【发布时间】:2018-10-05 22:23:50
【问题描述】:
我正在尝试创建一个静态库的静态库。这是我的CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(myRtspClient)
add_subdirectory(../third_party/Base64_live555 base64_live555)
add_subdirectory(../third_party/md5 md5)
add_subdirectory(../third_party/JRTPLIB jrtplib)
include_directories(include)
include_directories(../third_party/Base64_live555/include)
include_directories(../third_party/md5/include)
include_directories(jrtplib/src)
include_directories(../third_party/JRTPLIB/src)
file(GLOB SOURCES "*.cpp")
add_library(myRtspClient STATIC ${SOURCES})
add_library(libmd5 STATIC IMPORTED)
SET_PROPERTY(TARGET libmd5 PROPERTY IMPORTED_LOCATION ./md5/libmd5.a)
add_library(libbase64_live555 STATIC IMPORTED)
SET_PROPERTY(TARGET libbase64_live555 PROPERTY IMPORTED_LOCATION ./base64_live555/libbase64_live555.a)
add_library(libjrtp STATIC IMPORTED)
SET_PROPERTY(TARGET libjrtp PROPERTY IMPORTED_LOCATION ./jrtplib/src/librtp.a)
target_link_libraries(myRtspClient libmd5 libbase64_live555 libjrtp)
#install(TARGETS myRtspClient DESTINATION /usr/lib)
如您所见,我正在尝试通过将目标 myRtspClient 与 libmd5 libbase64_live555 libjrtp 链接来创建它。因为cmake 没有错误,即使我这样做了
target_link_libraries(myRtspClient eewgg dsgsg dgsgsdgsg)
我不能确定是什么错误。图书馆在我指出的位置。但是,我不知道它们是否在第一次编译中。我尝试了第二个,但谁知道......
所以,继续...我尝试了很多SET_PROPERTY,例如:
SET_PROPERTY(TARGET libbase64_live555 PROPERTY IMPORTED_LOCATION ./base64_live555/libbase64_live555.a)
SET_PROPERTY(TARGET libbase64_live555 PROPERTY IMPORTED_LOCATION ./base64_live555)
SET_PROPERTY(TARGET libbase64_live555 PROPERTY IMPORTED_LOCATION base64_live555/libbase64_live555.a)
当我转到examples 并尝试构建common_example.cpp(如有必要,请参阅上面链接中的源代码树)我会这样做:
g++ common_example.cpp -I ../myRtspClient/include ../myRtspClient/libmyRtspClient.a
但我收到如下链接错误:
utils.cpp:(.text+0x2f4): undefined reference to `MD5Init(MD5_CTX*)'
utils.cpp:(.text+0x316): undefined reference to `MD5Update(MD5_CTX*, unsigned char*, unsigned int)'
utils.cpp:(.text+0x32c): undefined reference to `MD5Final(MD5_CTX*, unsigned char*)'
../myRtspClient/libmyRtspClient.a(MediaSession.cpp.o): In function `MyRTPSession::MyRTPSession()':
MediaSession.cpp:(.text._ZN12MyRTPSessionC2Ev[_ZN12MyRTPSessionC5Ev]+0x1e): undefined reference to `jrtplib::RTPSession::RTPSession(jrtplib::RTPRandom*, jrtplib::RTPMemoryManager*)'
../myRtspClient/libmyRtspClient.a(myRtpSession.cpp.o): In function `MyRTPSession::IsError(int)':
myRtpSession.cpp:(.text+0x48): undefined reference to `jrtplib::RTPGetErrorString[abi:cxx11](int)'
../myRtspClient/libmyRtspClient.a(myRtpSession.cpp.o): In function `MyRTPSession::MyRTP_SetUp(MediaSession*)':
myRtpSession.cpp:(.text+0x1b5): undefined reference to `jrtplib::RTPSessionParams::RTPSessionParams()'
myRtpSession.cpp:(.text+0x25c): undefined reference to `jrtplib::RTPSession::Create(jrtplib::RTPSessionParams const&, jrtplib::RTPTransmissionParams const*, jrtplib::RTPTransmitter::TransmissionProtocol)'
我在链接过程中做错了什么? libMyRtspClient 应该将所有这些库链接到它。
更新:
似乎我无法将静态库链接在一起,也无法从静态库创建共享库。我应该如何将所有代码打包到一个共享库和一个静态库中?
【问题讨论】:
-
静态库不链接到其他静态库。
-
@tkausl 好的,我改成
add_library(myRtspClient SHARED ${SOURCES}),不是我得到/usr/bin/ld: md5/libmd5.a(md5.cpp.o): relocation R_X86_64_PC32 against symbol_Z12MD5TransformPjPh'不能在制作共享对象时使用;使用 -fPIC` 重新编译。好像我不能使用静态库来制作共享库?这里的解决方案是什么? -
Seems like I cannot use static libraries to make a shared one?- 你可以。只需按照错误消息:使用 -fPIC 重新编译静态库或在没有它的情况下编译共享库。
标签: c++ build cmake linker linker-errors