2016-09-05 60 views
1

我正在使用Eclipse C++中的Windows。我有這樣的結構在我的項目:創建一個可執行封裝2個其他項目

subProject A 
    -> creates a static library (works fine) 
subProject B encapsulating subproject A 
    -> creates a static library (works fine) 
subProject TestA 
    -> creates an executable (works fine) 
subProject TestB 
    |dev 
     |src 
     | CmakeList.txt 
    |CmakeList.txt 
    -> creates an executable (doesn't work) 

這是CmakeList.txt在爲TESTB可執行dev目錄:

set(${PROJECT_NAME}_INCLUDE_DIRS 
    $(CMAKE_CURRENT_SOURCE_DIR}/src 
    CACHE STRING "" FORCE) 

include_directories(${${PROJECT_NAME}_INCLUDE_DIRS}) 

file(GLOB_RECURSE ${PROJECT_NAME}_HEADER_FILES FOLLOW_SYMLINKS 
    ./*.hpp 
    ./*.h) 

file(GLOB_RECURSE ${PROJECT_NAME}_SORUCE_FILES FOLLOW_SYMLINKS 
    ./*.cpp 
    ./*.c) 

set(${PROJECT_NAME}_FILES ${${PROJECT_NAME}_HEADER_FILES} 
    ${${PROJECT_NAME}_SOURCE_FILES}) 

# Additional includes and link directories and dependencies 
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/A/include) 
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/B/include) 

if(${CMAKE_BUILD_TYPE} STREQUAL "Release") 
set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES} 
        A 
        B 
        pthread) 
elseif(${CMAKE_BUILD_TYPE} STREQUAL "Debug") 
set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES} 
        A 
        B 
        pthread) 
endif() 

# Add a library to the project 
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/A/lib) 
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../install/${CMAKE_BUILD_TYPE}/B/lib) 

add_executable(${PROJECT_NAME} ${${PROJECT_NAME}_FILES}) 

target_link_libraries(${PROJECT_NAME} ${${PROJECT_NAME}_EXTRA_LIBRARIES}) 

install(FILES ${${PROJECT_NAME}_HEADER_FILES} 
    DESTINATION ${CMAKE_INSTALL_PREFIX}/include/ 
    PERSMISSIONS OWNER_READ GROUP_READ WORLD_READ) 

install(TARGETS ${PROJECT_NAME} 
    ARCHIVE DESTINATION lib 
    LIBRARY DESTINATION lib 
    RUNTIME DESTINATION bin) 

在我的乙子項目,在文件中,我有這樣的:

#include "A.hpp" 

... 
A algo; 
A.method(parameters) 

當我建立我的TESTB,我對2號線出現在B類項目 AB這個奇怪的錯誤奧雅納這使得我的生成失敗:

undefined reference to A::A() 
undefined reference to A::method(parameter) 

當我發表意見,這些線路和重建B類項目TESTB項目它工作得很好,我在B項目庫,並在一個.exe文件TESTB。

我不明白我的問題在哪裏。

+0

如果使用'A',你需要對靜態鏈接庫項目A產生。 – StoryTeller

+0

我不太明白在哪裏鏈接和如何。在我的CmakeList.txt中?是不是'link_directories($ {CMAKE_CURRENT_SOURCE_DIR} /../../ install/$ {CMAKE_BUILD_TYPE}/A/lib)'命令已經鏈接了它? – user3314570

+0

不知道,是靜態庫的建立和位置?我還建議你嘗試將兩個'link_directories'命令合併成一個。這就是[cmake文檔所做的](https://cmake.org/cmake/help/v3.0/command/link_directories.html)。這可能是第二個電話會丟掉第一個電話。 – StoryTeller

回答

1

B依賴於A,所以將B的CMakeLists.txt中的依賴關係添加到A中,其中target_link_libraries。即使它是一個靜態庫,並且在生成B時也不會有任何實際鏈接,但無論如何,這將提示CMake每次將B鏈接到可執行文件時,還必須鏈接之後AA必須位於鏈接命令行中的B之後,以便在鏈接到A時知道B所需的符號。有關更多詳細信息,請參閱here

如果你正在尋找一個快速解決,而不是,只是改變:

set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES} 
        A 
        B 
        pthread) 

這個

set(${PROJECT_NAME}_EXTRA_LIBRARIES ${${PROJECT_NAME}_EXTRA_LIBRARIES} 
        B 
        A 
        pthread) 
+0

謝謝,我現在明白了。有效! – user3314570

相關問題