2013-10-02 52 views
5
cmake 2.8 
gcc (GCC) 4.8.1 

編輯----------連接使用CMake的

結束語在whole-archive作品爲每個庫的靜態庫除了pjmedia-videodev現在的問題靜態共享庫,當我嘗試並建立我得到以下錯誤。

cbar_factory_init': colorbar_dev.c:(.text+0x2a0): undefined reference to pjmedia_format_init_video' 

你好,

我創建了一個共享庫,我需要的是庫約10靜態庫鏈接。然後我將我的可執行文件與共享庫鏈接起來。

我的問題是,當我運行使它無法鏈接,因爲它也想要靜態庫。目的是爲靜態庫創建一個包裝器。所以可執行文件只需要鏈接一個單獨的共享庫。當我將共享庫鏈接到靜態庫時,靜態庫會自動成爲共享庫源代碼的一部分。

只有代碼sippnet使其短。 在我的CMakeLists.txt創建共享庫和鏈接的靜態庫:

add_library(app_module_sip SHARED app_module_sip_init.c) 

set(PJSIP_LIBRARIES 
    g7221codec 
    gsmcodec 
    ilbccodec 
    milenage 
    pj 
    pjlib-util 
    pjmedia 
    pjmedia-codec 
    pjmedia-audiodev 
    pjmedia-videodev 
    pjnath 
    pjsip 
    pjsip-simple 
    pjsip-ua 
    pjsua 
    portaudio 
    resample 
    speex 
    srtp 
) 

target_link_libraries(app_module_sip pthread m uuid nsl rt asound crypto ssl ${PJSIP_LIBRARIES}) 

現在我的CMakeLists.txt,使可執行

add_executable(app sip_test.c) 

target_link_libraries(app app_module_sip) 

這是正確的我在做什麼在這裏。我不想將可執行文件與靜態庫鏈接起來。只是單一的共享庫,因爲這是我的封裝,我將調用函數。

它確實鏈接好,如果我連接所有的靜態庫時做可執行文件,但這不是我想要的結果。

非常感謝您的任何建議,

回答

1
# Location for shared library 
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/libs) 

# Create shared library 
add_library(app_module_sip SHARED app_module_sip_init.c) 

# compile and link for 32 bit mode 
set_target_properties(app_module_sip PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") 

# PJSIP static libraries 
set(PJSIP_LIBRARIES 
    pjsua 
    pjsip-ua 
    pjsip-simple 
    pjsip 
    pjmedia-codec 
    pjmedia-videodev 
    pjmedia 
    pjmedia-audiodev 
    pjnath 
    pjlib-util 
    resample 
    milenage 
    srtp 
    gsmcodec 
    speex 
    ilbccodec 
    g7221codec 
    portaudio 
    pj 
) 

# Wrap the static libraries in to the shared library 
target_link_libraries(app_module_sip -Wl,--start-group ${PJSIP_LIBRARIES} -Wl,--end-group 
    m uuid nsl rt pthread asound crypto ssl) 

需要包裝pjsip庫將下列鏈接器命令-Wl, - start-group * .a -Wl, - end-group。

這解決了我的問題。

+0

當我將app_module_sip鏈接到myapp時,除了* app_module_sip之外,CMake似乎還添加了所有的孫子庫,比如pjsua *,重複的對象會擾亂靜態初始化,更不用說膨脹的二進制大小了。 – nodakai

3

我想測試我的解決辦法,但你的CMakeLists.txt不作任何修改爲我工作。不過,在看這個問題: Include static lib in dynamic lib,看來你應該嘗試

target_link_libraries(app_module_sip ... ssl -Wl,-whole-archive ${PJSIP_LIBRARIES} -Wl,-no_whole-archive) 

(滾動結束,這是一個漫長線)

+0

這確實對我有用。然而,我試圖鏈接失敗的靜態庫libpjmedia-videodev.a(colorbar_dev.o):在函數'cbar_factory_init': colorbar_dev.c :(。text + 0x2a0):未定義的引用'pjmedia_format_init_video'。但是,如果我刪除靜態庫pjmedia-videodev,則所有內容都將編譯,構建和運行。不知道爲什麼圖書館失敗。目前我不需要做任何視頻工作人員,但後來我會需要它。感謝您的建議。 – ant2009

2

這不是那麼簡單。

根據您的平臺,您可以使用'-Wl, - whole-archive'或'-Wl, - export-all-symbols',但沒有良好的跨平臺方式來執行此操作。一切都有所不同,並且Windows使用lib.exe播放完全不同的遊戲。

你可能想要做這樣的事情:

http://www.mail-archive.com/[email protected]/msg01890.html

...特別添加對要支持,一次一個的平臺的支持。

+0

@Doug,那篇文章是2006年,-all和-notall不再存在。我目前的版本是'GNU ld version 2.23.51.0.1-10.fc18',我想它在某個時候被刪除了。謝謝。 – ant2009

+0

@ ant2009不,我的意思是,使用IF(「$ {CMAKE_SYSTEM}」匹配IRIX)... IF(APPLE)... IF(WIN32)...等等。您必須爲每個想要支持的平臺手動指定不同的編譯標誌。沒有「通用」方式來做這個跨平臺的工作。 – Doug